2016-09-22 6 views
2

私はSQLを初めて使用しています。私は結果を得ることができないという質問があります。2つの別個のエンティティの行が存在するかどうかを確認する方法

以下の表から、私は 'Apollo'と 'Shuttle'ミッション(projectname)の両方を飛行した宇宙飛行士(astrno)をリストアップする必要があります。

projectname | missionno | astrono | role 
--------------+-----------+---------+---------------------- 
Apollo  | 1   |  22 | Commander 
Apollo  | 1   |  42 | Command Module Pilot 
Apollo  | 1   |  10 | Lunar Module Pilot 
Apollo  | 7   |  33 | Commander 
Apollo  | 7   |  16 | Command Module Pilot 
Apollo  | 7   |  14 | Lunar Module Pilot 
Apollo  | 8   |  5 | Commander 
Apollo  | 8   |  27 | Command Module Pilot 
Apollo  | 8   |  2 | Lunar Module Pilot 
Apollo  | 9   |  29 | Commander 
Apollo  | 9   |  36 | Command Module Pilot 
Apollo  | 9   |  35 | Lunar Module Pilot 
Apollo  | 10  |  39 | Commander 
Apollo  | 10  |  44 | Command Module Pilot 
Apollo  | 10  |  9 | Lunar Module Pilot 
Apollo  | 11  |  3 | Commander 
Apollo  | 11  |  11 | Command Module Pilot 
Apollo  | 11  |  1 | Lunar Module Pilot 
Apollo  | 12  |  12 | Commander 
Apollo  | 12  |  21 | Command Module Pilot 
Apollo  | 12  |  4 | Lunar Module Pilot 
Apollo  | 13  |  27 | Commander 
Apollo  | 13  |  40 | Command Module Pilot 
Apollo  | 13  |  23 | Lunar Module Pilot 
Apollo  | 14  |  37 | Commander 
Apollo  | 14  |  32 | Command Module Pilot 
Apollo  | 14  |  30 | Lunar Module Pilot 
Apollo  | 15  |  43 | Command Module Pilot 
Apollo  | 15  |  24 | Lunar Module Pilot 
Apollo  | 16  |  44 | Commander 
Apollo  | 16  |  28 | Command Module Pilot 
Apollo  | 16  |  15 | Lunar Module Pilot 
Apollo  | 17  |  9 | Commander 
Apollo  | 17  |  17 | Command Module Pilot 
Apollo  | 17  |  34 | Lunar Module Pilot 
Skylab  | 2   |  12 | Commander 
Skylab  | 2   |  41 | Pilot 
Skylab  | 2   |  25 | Scientist 
Skylab  | 3   |  4 | Commander 
Skylab  | 3   |  26 | Pilot 
Skylab  | 3   |  18 | Scientist 
Skylab  | 4   |  8 | Commander 
Skylab  | 4   |  31 | Pilot 
Skylab  | 4   |  19 | Scientist 
Apollo-Soyuz | 1   |  39 | Commander 
Apollo-Soyuz | 1   |  6 | Command Module Pilot 
Apollo-Soyuz | 1   |  38 | Docking Module Pilot 
Shuttle  | STS-1  |  44 | Commander 
Shuttle  | STS-1  |  119 | Pilot 
Shuttle  | STS-2  |  138 | Commander 
Shuttle  | STS-2  |  408 | Pilot 
Shuttle  | STS-3  |  25 | Commander 
Shuttle  | STS-3  |  156 | Pilot 
Shuttle  | STS-4  |  28 | Commander 
Shuttle  | STS-4  |  191 | Pilot 
Shuttle  | STS-5  |  6 | Commander 
Shuttle  | STS-5  |  309 | Pilot 
Shuttle  | STS-5  |  53 | Mission Specialist 
Shuttle  | STS-5  |  245 | Mission Specialist 

助けがあれば助かります。

ありがとうございました。

答えて

0

一つのオプション各宇宙飛行士のためのレコード上の条件集合を使用することである。

SELECT astrono 
FROM yourTable 
GROUP BY astrono 
HAVING SUM(CASE WHEN projectname = 'Apollo' THEN 1 ELSE 0 END) > 0 AND 
     SUM(CASE WHEN projectname = 'Shuttle' THEN 1 ELSE 0 END) > 0 
0

ここastrono = Tテーブルから1を選択し(存在するテーブルTから状態

選択astronoが存在する使用。天文学とプロジェクト名= 'Apollo')と存在する(astrono = t.astronoとprojectname = 'Shuttle'のテーブルから1を選択)。

0

ステップバイステップでそれをやりましょう。次のクエリでは、元のテーブルのすべての行を、ApolloおよびShuttleプロジェクトのみと関連付ける必要があります。我々は特定のプロジェクトを気にしないので、のは、それぞれの宇宙飛行士のためのプロジェクトのプロジェクトを返すために上記のクエリを変更してみましょうその後

SELECT * FROM mytable WHERE projectname IN ('Apollo', 'Shuttle') 

、:我々は唯一の宇宙飛行士を保つことができ、最後に

SELECT astrono, count(*) AS count 
FROM mytable 
WHERE projectname IN ('Apollo', 'Shuttle') 
GROUP BY astrono 

こと私たちは他のプロジェクトを参照するすべての行を排除してきたので、私たちはその宇宙飛行士とPRの組み合わせを想定した場合

SELECT astrono 
FROM mytable 
WHERE projectname IN ('Apollo', 'Shuttle') 
GROUP BY astrono 
HAVING count(*)>=2; 

:上記の数に基づいて、少なくとも二つのプロジェクトに参加宇宙飛行士が上記の数に基づいて2つのプロジェクトに参加したことが判明した場合、その2つのプロジェクトはApolloShuttleでなければなりません。

次のようにあなたが代わりにそれを行うことができ、宇宙飛行士、プロジェクトの各組み合わせは、最高1回表示されることを上記の仮定が気に入らない場合は、次の

SELECT astrono 
FROM mytable 
GROUP BY astrono 
HAVING bool_or(projectname='Apollo') OR bool_or(projectname='Shuttle'); 
+0

重複がある場合は、このクエリは動作しません。可能。このため、条件付き集約はより安全です。 –

関連する問題