使用两列的T-SQL“Where not in”
我想从表T1中选择所有记录,其中a列和B列中的值对于表T2中的C列和D列没有匹配的元组 在中,我可以阅读如何使用表格select A,B from T1实现,其中A,B不在select C,D from T2中,但在T-SQL中失败,导致“,”附近的语法不正确使用两列的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
那么我该怎么做呢?使用相关子查询:
...
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。