选择a和next是c的位置,跳过b

时间:2012-11-08 20:20:54

标签: sql sql-server-2005

我想知道在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          

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'