使用两列的T-SQL“Where not in”

使用两列的T-SQL“Where not in”,sql,tsql,Sql,Tsql,我想从表T1中选择所有记录,其中a列和B列中的值对于表T2中的C列和D列没有匹配的元组 在中,我可以阅读如何使用表格select A,B from T1实现,其中A,B不在select C,D from T2中,但在T-SQL中失败,导致“,”附近的语法不正确 那么我该怎么做呢?使用相关子查询: ... WHERE NOT EXISTS ( SELECT * FROM SecondaryTable WHERE c = FirstTable.a AND d = FirstTab

我想从表T1中选择所有记录,其中a列和B列中的值对于表T2中的C列和D列没有匹配的元组

在中,我可以阅读如何使用表格select A,B from T1实现,其中A,B不在select C,D from T2中,但在T-SQL中失败,导致“,”附近的语法不正确


那么我该怎么做呢?

使用相关子查询:

  ... 
WHERE 
  NOT EXISTS (
    SELECT * FROM SecondaryTable WHERE c = FirstTable.a AND d = FirstTable.b
  )
确保在c,d上的SecondaryTable上有一个复合索引,除非该表不包含很多行。

您不能使用WHERE IN type语句来实现这一点

相反,您可以左键连接到目标表T2并选择T2.ID为NULL的位置

比如说

SELECT 
    T1.*
FROM
    T1 LEFT OUTER JOIN T2
    ON T1.A = T2.C AND T1.B = T2.D
WHERE
    T2.PrimaryKey IS NULL

将只返回T1中在T2中没有对应行的行。

我在Mysql中使用了它,因为在Mysql中没有EXCLUDE语句

此代码:

将表T2的字段C和D合并为一个新字段,以便于比较列。 将表T1的字段A和B合并到一个新字段中,以便于比较列。 选择T1新字段值不等于T2新字段值的所有记录。 SQL语句:

SELECT T1.* FROM T1 
  WHERE CONCAT(T1.A,'Seperator', T1.B) NOT IN
    (SELECT CONCAT(T2.C,'Seperator', T2.D) FROM T2)

下面是一个对我有效的答案示例:

SELECT Count(1) 
    FROM LCSource as s
    JOIN FileTransaction as t
    ON s.TrackingNumber = t.TrackingNumber  
    WHERE NOT EXISTS (
        SELECT * FROM LCSourceFileTransaction 
        WHERE [LCSourceID] = s.[LCSourceID] AND [FileTransactionID] = t.[FileTransactionID]
    )

您可以看到这两列都存在于LCSourceFileTransaction中,但其中一列出现在LCSource中,另一列出现在FileTransaction中,LCSourceFileTransaction是一个映射表。我想查找映射表中没有这两列组合的所有记录。这很有效。希望这对某人有所帮助。

我不确定我是否理解,但似乎托马拉克给了我一个答案!不过谢谢!这是一个很好的选择!不起作用。FirstTable不是在second SELECT中声明的。您能解释一下为什么这个语句回答了这个问题吗?谢谢。你能看一下你的第一句话吗?我不知道你想说什么。这个问题是关于T-SQL的,因为MySQL不支持WHERE not IN。我也有同样的问题,但是MySQL。当我解决这个问题时,我把我的答案放在这里,也许这对使用mysql的人有用。此方法也适用于T-SQL。