2015-06-22 26 views
1

有人可以告诉我这是一个排除?有人可以向我解释这个声明是如何排除的吗?

假设TABLEID是自动生成的,并在columnY可以有0或1。该声明价值应该排除一切都是columnY有1

SELECT * 
    FROM [table].[dbo].[one] AS t1 
LEFT JOIN [table].[dbo].[one] AS t2 
    ON (t1.ColumnX = t2.ColumnX AND columnY = 1) 
WHERE t1.tableID IS NULL 

一个值,因此表将是这个样子:

ID | ColumnX | ColumnY 
1  Blue  0 
2  Blue  1 
3  Red   0 
4  Red   0 
5  Red   1 
+0

你确定你已经正确地转录了查询吗? 'WHERE righttable.column为null'是一种常见的从'lefttable'查找行的方法,这些行没有由'lefttable LEFT JOIN righttable'生成的匹配行。但是你显示'WHERE lefttable.column为null'。 –

回答

1

我可以解释...一个非常接近你的查询。让我它改成:

SELECT * 
    FROM [table].[dbo].[one] AS t1 
    LEFT JOIN [table].[dbo].[one] AS t2 
     ON (t1.ColumnX = t2.ColumnX AND t2.columnY = 1) 
    WHERE t2.tableID IS NULL 

该查询检索来自t1所有行,然后检查是否存在在t2一排(即在同一台)与ColumnX相同值,其中ColumnY为1。

如果该行存在,那么它会列出从t1(加上t2一堆空的)与ColumnX这个值的所有行。但是,如果该行确实存在,那么将排除该值为ColumnX的行(因为t2.id IS NOT NULL)。

Here是一个可以玩的SQLFiddle。

0

使用此

SELECT * 
    FROM [table].[dbo].[one] AS t1 
LEFT JOIN [table].[dbo].[one] AS t2 
    ON (t1.ColumnX = t2.ColumnX) AND (columnY = 1) 
    WHERE t1.tableID IS NULL 

所以表看起来索姆ething这样的:

ID | ColumnX | ColumnY 
2  Blue  1 
5  Red   1 

或者你可以用这个

SELECT * 
    FROM [table].[dbo].[one] AS t1 
LEFT JOIN [table].[dbo].[one] AS t2 
    ON (t1.ColumnX = t2.ColumnX) 
    WHERE t2.columnY = 1 AND t1.tableID IS NULL 

所以表将是这个样子:

ID | ColumnX | ColumnY 
2  Blue  1 
5  Red   1 

我希望这会帮助你。谢谢

+0

太棒了,谢谢。 – user296868

+0

@ user296868欢迎您,请接受我的回答 –

相关问题