2016-04-07 12 views
1

私はPL/SQLを使用しています。単純なSQLクエリ1

Table = Stuff 

ID: FRUIT: 
100 Apple 
100 Grape 
200 Apple 
200 Orange 
550 Apple 
700 Orange 
800 Orange 
900 Grape 
... ... 

オレンジと同じIDを共有しないすべてのAppleとそのIDをリストしたいとします。これをどうやって行うのですか?

出力は次のようになります。

100 Apple 
550 Apple 
+0

期待される出力と、おそらく試したクエリを表示すると便利です。 –

+0

編集ありがとう!私はそれが結合かインナーセレクトかわからないので、私はSQLクエリを持っていません:( – John

答えて

1

ApplesであるフルーツとIDはサブクエリに含まれていません。このようなもの;

SELECT * 
FROM stuff 
WHERE fruit = 'Apple' 
    AND ID NOT IN (SELECT ID FROM stuff WHERE fruit = 'Orange') 
+0

これは、自分のような初心者のために理解するのが最も簡単で簡単でした。ありがとう! – John

1

あなたが他のレコードの1つのセットを引いていると、サブクエリは仕事を行います。新しいデータのための 編集は

select * 
from stuff 
where fruit = 'Apple' 
and id not in (
select ID from stuff where fruit != 'Apple' 
); 

を設定したり、あなたにもMINUSクエリを使用することができます。

+0

あなたはリンゴのために余分なフィルタが必要だと思います –

+0

@ vc74それは我々が続行しなければならない情報で言うのは難しいです。 – kevinsky

+0

バナナ、タンジェロス、パパイヤがある場合は、in節にも同様に情報を含める必要があります。私は、kevinskyの答えは可能な限り完全で正しいと言います。 –

1

あなたはCASE EXPRESSIONを使用して一度だけのテーブルから選択して、このようなGROUP BY WITH HAVING句ことができます:あなたが効果的に、このサブクエリではオレンジのためのIDのすべてを選ぶようにするには、サブクエリでこれを行うことができ

SELECT t.id, 
     MAX(CASE WHEN t.FRUIT = 'Apple' THEN t.FRUIT end) as fruit 
FROM stuff t 
GROUP BY t.id 
HAVING MAX(CASE WHEN t.FRUIT = 'Orange' THEN 1 ELSE 0 END) = 0 
+0

これはまだ進んでいませんが、私はそれらの新しいステートメント(Max、Caseなど)のいくつかを学ぶときに便利にしておきます。 – John

1

オレンジのIDの完全なリストを構築する必要がちょうどnot existを使用し、ありません:

​​

または外部結合で同じことを実行します。

select 
    id, fruit 
from (
    select 
    apple_list.id, 
    apple_list.fruit, 
    nvl2(orange_instance.id, 'orange_here', 'no_orange') orange_flag 
    from 
    stuff apple_list, 
    stuff orange_instance 
    where 
    apple_list.fruit = 'Apple' 
    and 
    orange_instance.id (+) = apple_list.id 
    and 
    orange_instance.fruit (+) = 'Orange' 
) 
where 
    orange_flag = 'no_orange' 

を第二の変形がdistinctを必要とします同じidの2つのオレンジがある可能性がある場合は選択します。

+0

これは素晴らしい例です!ありがとう! – John

1

それとも、MINUS集合演算子を使用してそれを行うことができます:

SELECT a.ID, a.FRUIT 
    FROM STUFF a 
    WHERE a.FRUIT = 'Apple' 
MINUS 
SELECT b.ID, 'Apple' AS FRUIT 
    FROM STUFF b 
    WHERE b.FRUIT = 'Orange' 

運のベスト。