我想从表 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 中失败对我来说导致“','附近的语法不正确。”。
那么我该怎么做呢?
我想从表 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 中失败对我来说导致“','附近的语法不正确。”。
那么我该怎么做呢?
使用相关子查询:
...
WHERE
NOT EXISTS (
SELECT * FROM SecondaryTable WHERE c = FirstTable.a AND d = FirstTable.b
)
确保 SecondaryTable over 上有一个复合索引(c, d)
,除非该表不包含很多行。
您不能使用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 中没有对应行的行。
我在 Mysql 中使用它是因为在 Mysql 中没有“EXCLUDE”语句。
这段代码:
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 是一个映射表。我想找到两列的组合不在映射表中的所有记录。这很好用。希望这可以帮助某人。