2 liberty chen liberty_chen 于 2015.07.20 11:10 提问

SQL 表A(id,no,name)、表C(no)怎么判断每个人缺少的no并且把缺少的新增进表A
sql

表A数据
(1,'A','张三')
(1,'B','张三')
(2,'A','李四')
(3,'B','王五')

表C数据
(A)
(B)
(C)

怎么判断每个人缺少的no并且把缺少的新增进表A ???
如张三缺少C,则新增(1,'C','张三');
李四缺少B、C,则新增(2,'B','李四')(2,'C','李四')
以此类推、、、

6个回答

danielinbiti
danielinbiti   Ds   Rxr 2015.07.20 11:28
已采纳
 create table ma(
   id int,
   fe varchar(20),
   vname varchar(20)
);
insert into ma values(1,'A','张三');
insert into ma values(1,'B','张三');
insert into ma values(2,'A','李四');
insert into ma values(3,'B','王五');
create table mb(
  fe varchar(20)
);

insert into mb values('A');
insert into mb values('B');
insert into mb values('C');
insert into ma(id,fe,vname) values(
SELECT id,vname,fe FROM (
select c.*,c.vname + ','+c.fe as kid from (
select * from 
(
select distinct id,vname from ma
) a,
(select fe from mb)
b 
) c 
) D 
where kid not in(SELECT VNAME+','+FE FROM ma)
)
danielinbiti
danielinbiti 回复liberty_chen: 可以,可以把flag拼接上
2 年多之前 回复
liberty_chen
liberty_chen select c.*,c.vname + ','+c.fe + '0' as kid from ( select * from ( select distinct id,vname from ma ) a, (select fe from mb) b ) c ) D where kid not in(SELECT VNAME+','+FE+',' +flg FROM ma) ) 这样是不是就可以了,但是如果还有一个标志位2为修改呢?
2 年多之前 回复
liberty_chen
liberty_chen 你看可不可以这样,如果标志位的字段为flg,那么把后面的改成这样行不行?
2 年多之前 回复
liberty_chen
liberty_chen 你看可不可以这样,如果标志位的字段为flg,那么把后面的改成这样行不行?
2 年多之前 回复
liberty_chen
liberty_chen 如果表A需要增加一个标志位表示新增为0,表示删除的为1,这样的话按照上面的思路会区分不出来删除和新增的,这样的话需要怎么改进 ?
2 年多之前 回复
sinat_21703099
sinat_21703099 稍微有点麻烦
2 年多之前 回复
qq_25265293
qq_25265293   2015.07.23 11:22

假设表a的3个字段是id,code,name,其中id和name是一一对应的,是吧;
表c的字段是code,不重复,那么下面这个语句就可以了

insert into a
select x.id,c.code,x.name from
(select distint id,name from a) x,c
minus
select id,code,name from a;

解释一下:x表是所有的id和name组合,c表是所有code组合,做1个笛卡尔积查询就是所有的id、code、那么组合
再minus表a中已经存在的组合,就把剩下缺的组合加进去了

liberty_chen
liberty_chen 如果表A需要增加一个标志位表示新增为0,表示删除的为1,这样的话按照上面的思路会区分不出来删除和新增的,这样的话可以怎么改进 ?
2 年多之前 回复
huamei13
huamei13   2015.07.20 11:17

对表C来说,你采用推的方式;当表C有新增项的时候,你就往表A写。

liberty_chen
liberty_chen 这个要怎么写,推 ?
2 年多之前 回复
CSDNXIAOD
CSDNXIAOD   2015.07.20 11:21
bulusli3
bulusli3   Ds   Rxr 2015.07.20 11:23

写一个存储过程,通过repeat遍历A表的数据,然后对每一条数据进行查询,看是否在C表中存在相应的no,如果不存在,就插入一条数据在A中,具体写法可以在网上找找。

liberty_chen
liberty_chen 但是怎么判断是每个人是否存在相应的no呢 ?
2 年多之前 回复
fang2020
fang2020   2015.07.20 15:06

create table ma(
id int,
fe varchar(20),
vname varchar(20)
);
insert into ma values(1,'A','张三');
insert into ma values(1,'B','张三');
insert into ma values(2,'A','李四');
insert into ma values(3,'B','王五');
create table mb(
fe varchar(20)
);

insert into mb values('A');
insert into mb values('B');
insert into mb values('C');

INSERT INTO MA SELECT * FRM (
SELECT MA.ID,MA.NAME,MB.NO
FROM MA
JOIN MB AND MA.NO <>MB.NO
)

Csdn user default icon
上传中...
上传图片
插入图片