要求是将表B中的行复制到表A中。只有具有不存在的id的行才需要复制:
INSERT INTO A(id, x, y)
SELECT id, x, y
FROM B b
WHERE b.id IS NOT IN (SELECT id FROM A WHERE x='t');
^^^^^^^^^^^
现在,我试图用外部联接来编写这个来比较解释路径,但我不能写这个(至少有效率)。
请注意,使用^突出显示的sql会使这一点变得棘手。
答案 0 :(得分:4)
试
INSERT INTO A(id, x, y)
SELECT id, x, y
FROM TableB b
Left Join TableA a
On a.Id = b.Id
And a.x = 't'
Where a.Id Is Null
但我更喜欢子查询表示,因为我认为它更清楚地表达了你正在做的事情。
答案 1 :(得分:3)
为什么你对自己拥有的东西不满意?如果你检查你的解释计划,我保证你会说如果优化器认为这是最有效的方式(最有可能的话),就会执行反连接。
对于阅读此内容的每个人:SQL不是实际执行的内容。 SQL是一种告诉数据库你想要什么,而不是做什么的方法。所有体面的数据库都能够将NOT EXISTS和NOT IN视为相等(当它们是,即没有空值时)并执行反连接。使用外连接和IS NULL条件的技巧在SQL Server上不起作用(SQL Server不够聪明,无法将其转换为反连接)。
答案 2 :(得分:0)
您的查询将比使用外部联接的查询执行得更好。
我想以下查询将完成这项工作:
INSERT INTO A(id, x, y)
SELECT id, x, y
FROM B b
LEFT JOIN A a
ON b.id = a.id AND NOT a.x='t'
答案 3 :(得分:0)
INSERT INTO A (id, x, y)
SELECT
B.id, B.x, B.y
FROM
B
WHERE
NOT EXISTS (SELECT * FROM A WHERE B.id = A.id AND A.x = 't')