在两个表中查找不同的列集?

时间:2017-03-20 12:06:26

标签: sql database sqlite distinct union

使用SQLite,我们说我有这两个表:

A
_id  num  name  group  data1  data2   
1    4    ABC   I              
2    4    CDE   I              
3    5    CDE   I                       
4    5    CDE   I                       
5    5    CDE   II             

B (doesn't have a _id column)
     num  name  group  data1  data2 
     4    ABC   I      x      y     
     4    CDE   I      x1     y1    
     5    CDE   I      x2     y2    
     5    CDE   I      x3     y3    
     5    CDE   II     x4     y4    
     6    DEF   III    x5     y5    

请注意,表B中没有主键。我想使用表B中的数据值更新表A中的值,但仅针对可由列num唯一标识的行,{两个表中的{1}}和name或表A中根本不存在。这些列本质上是一种组合键,是连接数据库中两行的唯一方法。

结果看起来像这样:

group

我一直试图绕过这个问题几天,尝试了各种解决方案,但似乎没有任何好处。我的实际表每个包含大约3000行(表B是表A的更新,有几百个小的更改)。我得出的结论是,需要对不容易唯一标识的行进行一些手动编辑,但最好尽量减少它们。大多数行似乎都有A _id num name group data1 data2 1 4 ABC I x y 2 4 CDE I x1 y1 3 5 CDE I 4 5 CDE I 5 5 CDE II x4 y4 6 6 DEF III x5 y5 numname的唯一组合,因此这是我目前的目标。

我想知道从表A中选择所有不同的(关于groupnumname)行以及表B中所有类似的不同行,然后我应该能够迭代B中的行,找到表A中的相应(再次关于列groupnumname)行,并将值从B复制到A 。

但我不确定这样做的方法,或者如何去做...

2 个答案:

答案 0 :(得分:0)

此查询仅返回唯一的B

select num, name, group, min(data1) as data1, min(data2) as data2 
from B
group by num, name, group
having count(*)=1

用它来更新A表。

答案 1 :(得分:0)

首先更新现有的唯一行:

with q(_id,data1,data2) as(
  select A._id,B.data1,B.data2
    from A
    join B
      on B.num=A.num and B.name=A.name and B."group"=A."group"
   group by A.num,A.name,A."group"
   having count(1)=1
)
update A
   set data1=(select data1 from Q where Q._id=A._id),
       data2=(select data1 from Q where Q._id=A._id)
 where A._id in(select _id from Q);

然后插入新行:

insert into A(num,name,"group",data1,data2)
 select num,name,"group",data1,data2
   from B
  where not exists(select 1
                     from A
                    where B.num=A.num and B.name=A.name and B."group"=A."group"
                   );
相关问题