【问题标题】:can this be written with an outer join这可以用外连接写吗
【发布时间】:2010-12-24 04:56: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 使这变得很棘手。

【问题讨论】:

  • 您使用的是什么数据库?您的其他问题参考 Informix...

标签: sql database select null outer-join


【解决方案1】:

试试

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】:

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

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

    【讨论】:

      【解决方案3】:

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

      我猜下面的查询可以完成这项工作:

      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】:
        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')
        

        【讨论】:

          猜你喜欢
          • 2016-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-26
          • 2015-01-17
          相关资源
          最近更新 更多