代码之家  ›  专栏  ›  技术社区  ›  rouble

这个能用外接写吗

  •  0
  • rouble  · 技术社区  · 15 年前

    要求将表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 回复  |  直到 13 年前
        1
  •  4
  •   Charles Bretana    15 年前

    尝试

    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
    

    但是我更喜欢子查询表示,因为我认为它更清楚地表达了您正在做的事情。

        2
  •  3
  •   John Saunders    15 年前

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

    对于所有读到这些的人来说:SQL并不是实际执行的。SQL是一种告诉数据库您想要什么,而不是做什么的方法。所有像样的数据库将能够处理不存在和不平等(当它们存在时,即没有空值)并执行反连接。但是,使用外部联接和IS NULL条件的技巧在SQL Server上不起作用(SQL Server不够聪明,无法将其转换为反联接)。

        3
  •  0
  •   Li0liQ    15 年前

    您的查询将比使用外部联接的查询执行得更好。

    我想下面的问题可以解决这个问题:

    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'
    
        4
  •  0
  •   user565869    13 年前
    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')