0

要求是将表 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

4 回答 4

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

但我更喜欢子查询表示,因为我认为它更清楚地表达了你在做什么。

于 2009-12-07T21:53:26.280 回答
3

为什么你对你所拥有的不满意?如果您检查您的解释计划,我向您保证,如果优化器认为这是最有效的方式(它很可能会),它会说执行了反连接。

对于阅读本文的每个人:SQL 不是实际执行的。SQL 是一种告诉数据库你想要什么而不是做什么的方式。所有体面的数据库都将能够将 NOT EXISTS 和 NOT IN 视为相等(当它们相等时,即没有空值时)并执行反连接。但是,外部联接和 IS NULL 条件的技巧在 SQL Server 上不起作用(SQL Server 不够聪明,无法将其转换为反联接)。

于 2009-12-07T21:57:58.227 回答
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'
于 2009-12-07T21:55:20.320 回答
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')
于 2011-11-03T22:11:43.967 回答