我想知道在SQL中是否可以返回要显示的单行,使用下面的表格作为示例,只有id为2的行:
table1 ( id 2 and 4 are missing value b)
id value
1 a
1 b
1 c
1 d
2 a
2 c
2 d
3 a
3 b
3 c
3 d
4 a
4 c
4 d
我基本上想找到'b'不存在的所有实例,但是对于任何id仍然存在'a'并且为任何给定的id返回单行。我尝试过类似的东西,但它不能像我希望的那样工作:
select * from table1
where not exists (select distinct value from table1 where value b)
我希望最终结果是这样的,确定'b'不存在但是'a'的值(不显示值,最终目标不需要):
result table
id
2
4
答案 0 :(得分:3)
SELECT id
FROM table1 t1
WHERE
value = 'a'
AND NOT EXISTS (
SELECT *
FROM table1 sub
WHERE sub.id = t1.id AND sub.value = 'b'
)
答案 1 :(得分:2)
Haven没有经过测试,但我认为这样的事情会起作用。
SELECT id FROM table1
WHERE value='a' AND id NOT IN(SELECT id FROM table1 WHERE value='b')
GROUP BY id;
答案 2 :(得分:2)
这应该做的工作:
select distinct id
from table1 t
where not exists (
select 1
from table1 tt
where t.id = tt.id and tt.vallue = 'b'
)
and exists (
select 1
from table1 tt
where t.id = tt.id and tt.vallue = 'a'
)
下面你有更短的表格。如果对(id,value)是唯一的,那么它可能表现得更好并且不需要不同的关键字。
select distinct id
from table1 t
left join table1 tt
on t.id = tt.id and tt.value = 'b'
where t.value = 'a'
and tt.id is null
答案 3 :(得分:1)
编辑:向Dooh道歉。我刚刚注意到这个答案基本上是Dooh第二个查询的副本。我将把它作为一个可运行的例子。
比较各种查询的执行计划可能很有启发性。
declare @table1 as table ( id int, value varchar(10) )
insert into @table1 ( id, value ) values
( 1, 'a' ), ( 1, 'b' ), ( 1, 'c' ), ( 1, 'd' ),
( 2, 'a' ), ( 2, 'c' ), ( 2, 'd' ),
( 3, 'a' ), ( 3, 'b' ), ( 3, 'c' ), ( 3, 'd' ),
( 4, 'a' ), ( 4, 'c' ), ( 4, 'd' ),
( 5, 'a' ), ( 5, 'a' ), ( 5, 'b' ), -- Duplicate 'a's.
( 6, 'a' ), ( 6, 'a' ) -- Duplicate 'a's.
select distinct L.id
from @table1 as L left outer join
@table1 as R on R.id = L.id and R.value = 'b'
where R.id is NULL and L.value = 'a'