【问题标题】:SQL Statement Question - How to retrieve records of a table where the primary key does not exist in another table as a foreign keySQL语句问题-如何检索另一个表中不存在主键的表的记录作为外键
【发布时间】:2010-08-06 20:05:10
【问题描述】:

我有一个表 (TableA),其中主键作为外键存在于另一个表 (TableB) 上。我正在尝试编写一个 SQL 查询(我使用的是 SQL Server 2005),它将查找 TableA 中的所有记录,其中主键在 TableB 中不存在作为外键(我们会说加入 TableAID)。我怀疑它会使用外部连接,但我一直在努力。任何人都可以帮助 SQL 新手吗?

【问题讨论】:

  • @All,那么以下哪个答案会被认为最适合性能?

标签: sql sql-server-2005 tsql


【解决方案1】:
SELECT A.*
FROM TableA AS A
LEFT JOIN TableB AS B ON (A.ID = B.TableAID)
WHERE B.TableAID IS NULL

【讨论】:

  • @DaMartyr,你是对的。 LEFT JOIN 是外连接。技术上LEFT OUTER JOIN.
  • 这可能比其他答案中的不存在方法效率低。
【解决方案2】:

你可以使用不存在

SELECT columnlist
FROM TableA
WHERE NOT EXISTS(
   SELECT * FROM TableB
   WHERE TableB.column = TableA.column)

【讨论】:

    【解决方案3】:

    这几乎是 SQL 中的自然语言(“WHERE NOT EXISTS”):

    SELECT A.*
    FROM TableA AS A
    WHERE NOT EXISTS ( SELECT 1
                       FROM TableB
                       WHERE TableA.ID = B.TableAID
                     )
    

    【讨论】:

      【解决方案4】:
      Select * from TableA 
      where 
       TableA.TableAID not in (select TableB.TableAID from TableB)
      

      【讨论】:

      • 这将比其他人建议的不存在查询执行得更差。
      • 如果 TableB.TableAID 至少有一条记录为空,这将提供一个空结果。
      • 如果可以避免的话,我真的尽量不要使用 IN,因为它是一个非常慢的操作,并且与 NULL 不匹配。
      • @Frank 但我怎么知道他的问题???他说数据完整性问题与您所说的问题相反。
      • @Achilles - 是的,他没有说明 TableB.TableAID 中是否有空值。但他也没有说没有空值。并且 NOT EXISTS 或 LEFT JOIN/IS NULL 解决方案在这两种情况下都会提供正确的结果,如果存在空值,NOT IN() 解决方案会提供空结果 - 这是错误的(假设 TableA 中有没有匹配的 ID表 B 中的键)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 2020-05-15
      相关资源
      最近更新 更多