2012-07-30 51 views

回答

22

使用相关子查询:

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

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

+0

这是一个外观极好的选择! – RolandoCC 2015-05-11 13:50:31

+0

不起作用。 FirstTable没有在第二个SELECT中声明。 – 2016-08-07 23:08:25

4

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

+0

我不知道我的理解,但Tomalak似乎给了我一个答案!不过谢谢! – 2012-07-30 07:22:43

1

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

此代码:

  1. Concates字段表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) 
+0

你能解释为什么这个说法回答这个问题吗? – 2016-08-08 05:28:36

+0

FH-Inway:我在代码之前写下注释。 – 2016-08-08 12:55:54

+0

谢谢。你能否看看你的第一句话,我不确定你想说什么。问题是关于T-SQL,因为MySQL不支持'WHERE NOT IN'。 – 2016-08-08 15:49:55