有人可以向我解释这个陈述是如何排除的吗?

时间:2015-06-22 03:22:49

标签: sql sql-server tsql

有人可以告诉我这是一个排除吗?

假设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

2 个答案:

答案 0 :(得分: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}}是1。

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

Here是一个可以玩的SQLFiddle。

答案 1 :(得分: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

所以表格看起来像这样:

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

我希望这会对你有所帮助。谢谢