这可以用外连接写

时间:2009-12-07 21:50:38

标签: sql database select null outer-join

要求是将表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会使这一点变得棘手。

4 个答案:

答案 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')
相关问题