T-SQL“如果不是在”使用两列(T-SQL “Where not in” using two co

2019-07-30 16:42发布

我想从表T1其中在列A和B的值具有用于在表T2中的列C和d没有匹配的元组选择的所有记录。

在MySQL的使用两列“哪里没有”我可以读取如何完成,使用形式选择A,从T1 B,其中(A,B)不在(SELECT C,d从T2),但在T-SQL失败对我造成“附近有语法错误‘’。”

所以,我该怎么办呢?

Answer 1:

使用相关子查询:

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

确保有超过上SecondaryTable一个综合指数(c, d)除非该表不包含许多行。



Answer 2:

使用你不能做到这一点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对应的行。



Answer 3:

我用它在MySQL,因为在MySQL没有“排除”的语句。

此代码:

  1. Concates领域C和表T2进入一个新的领域的d,使其更容易对列进行比较。
  2. Concates领域A和表T1的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)


Answer 4:

这里是为我工作的答案的例子:

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是映射表。 我想找到的所有记录中,其中两列的组合是不是在映射表。 这个伟大的工程。 希望这可以帮助别人。



文章来源: T-SQL “Where not in” using two columns
标签: sql tsql