4

以下の表を例として、ID 2 の行のみを使用して、表示する単一の行を返すことが SQL で可能かどうか疑問に思っています。

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、値)が一意であれば、パフォーマンスが向上し、個別のキーワードは不要になる場合があります。

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の2番目のクエリの複製であることに気づきました。実行可能な例として残しておきます。

さまざまなクエリの実行プランを比較することは、啓蒙的かもしれません。

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 に答える