19

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

使用两列的 mysql “Where not in” 中,我可以阅读如何使用表格 select A,B from T1 where (A,B) not in (SELECT C,D from T2) 来完成此操作,但在 T-SQL 中失败对我来说导致“','附近的语法不正确。”。

那么我该怎么做呢?

4

4 回答 4

35

使用相关子查询:

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

确保 SecondaryTable over 上有一个复合索引(c, d),除非该表不包含很多行。

于 2012-07-30T07:09:07.290 回答
8

您不能使用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 中没有对应行的行。

于 2012-07-30T07:09:16.017 回答
1

我在 Mysql 中使用它是因为在 Mysql 中没有“EXCLUDE”语句。

这段代码:

  1. 将表 T2 的字段 C 和 D 连接到一个新字段中,以便于比较列。
  2. 将表 T1 的字段 A 和 B 连接到一个新字段中,以便于比较列。
  3. 选择 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)
于 2016-08-08T04:46:59.050 回答
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 是一个映射表。我想找到两列的组合不在映射表中的所有记录。这很好用。希望这可以帮助某人。

于 2018-10-18T21:26:03.263 回答