4

我想知道是否可以在 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'不存在但'a'对于任何id仍然存在的所有实例,并为任何给定的id返回一行。我已经尝试过这样的事情,但它没有像我想要的那样工作:

select * from table1 
    where not exists (select distinct value from table1 where value b)   

我希望最终结果是这样的,确定“b”不存在但“a”存在的值(不显示值,最终目标不需要):

result table
id        
2           
4          
4

4 回答 4

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'
    )
于 2012-11-08T20:24:33.283 回答
2

尚未测试,但我认为这样的事情会起作用。

SELECT id FROM table1 
WHERE value='a' AND id NOT IN(SELECT id FROM table1 WHERE value='b') 
GROUP BY id;
于 2012-11-08T20:24:25.500 回答
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
于 2012-11-08T20:24:33.223 回答
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'
于 2012-11-08T20:39:16.927 回答