使用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
,num
和name
的唯一组合,因此这是我目前的目标。
我想知道从表A中选择所有不同的(关于group
,num
和name
)行以及表B中所有类似的不同行,然后我应该能够迭代B中的行,找到表A中的相应(再次关于列group
,num
和name
)行,并将值从B复制到A 。
但我不确定这样做的方法,或者如何去做...
答案 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"
);