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

时间:2012-07-30 07:06:10

标签: sql tsql

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

mysql “Where not in” using two columns我可以阅读如何使用从T1中选择A,B的形式来实现这一点,其中(A,B)不在(SELECT C,D从T2),但在T-SQL中失败我导致“语法不正确','。”。

那我该怎么做?

4 个答案:

答案 0 :(得分:28)

使用相关的子查询:

  ... 
WHERE 
  NOT EXISTS (
    SELECT * FROM SecondaryTable WHERE c = FirstTable.a AND d = FirstTable.b
  )

确保SecondaryTable上的复合索引超过(c, d),除非该表不包含很多行。

答案 1 :(得分:5)

您无法使用WHERE IN类型语句执行此操作。

相反,您可以LEFT JOIN到目标表(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对应行的行。

答案 2 :(得分:1)

我在Mysql中使用它,因为在Mysql中没有' t" EXCLUDE"言。

此代码:

  1. 将表T2的字段C和D合并为一个新字段,以便更容易比较列。
  2. 将表T1的字段A和B汇总到一个新字段中,以便更容易地比较列。
  3. 选择T1新字段的值不等于T2新字段值的所有记录。
  4. 的SQL语句:

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

答案 3 :(得分:0)

以下是对我有用的答案示例:

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是映射表。我想查找映射表中没有这两列组合的所有记录。这很好。希望这对某人有帮助。