2017-03-28 8 views
2

私は、2つの列、albumIDとphotoIDを持つテーブルを持っています。特定の値なしですべてのレコードを検索するためのSQLクエリ

albumIDにないすべてのphotoIDの列を返すにはどうすればよいですか?例えば

、私は今の写真2と3 を表示したい、私はこのテーブルを持っていると言うと、私は0

|albumID|photoID| 
|0  |0  | 
|0  |1  | 
|1  |0  | 
|1  |2  | 
|1  |3  | 

その後アルバムに含まれていないすべてのPHOTOIDさんを見つけたいです、私はこのクエリがあります:写真0,2,3を返し

SELECT DISTINCT photoID FROM PhotoInAlbum WHERE AlbumID <> 1 

を、しかし、アルバム内の0が表示されます0

本当にありがとうございました!

+0

アルバム0でないものを維持するために、あなたの結果を制限するHAVINGを使用してください。具体的な理由は何ですか?また、このシナリオでは大したことはありませんが、データベースにタグを付けます。 – Utsav

+0

SQLに関する質問では、DBMSに常にタグを付ける必要があります。 –

答えて

3
SELECT DISTINCT photoID FROM PhotoInAlbum WHERE photoID NOT IN 
(
SELECT photoID from PhotoInAlbum WHERE AlbumID = 0 
) 

ます。また左自己結合を使用して、この近づくことができsubquery

+3

'NOT IN'はNULLが関わっているときに少し驚くような動作をします。だから、私は通常、代わりに' NOT EXISTS'を勧めます。 – jarlh

+0

一方、無関係な 'NOT IN'は通常' NOT EXISTS'より読みやすく、サブクエリがnullを返すことができる状況は非常にまれです。しかし、はい、それは考慮すべきポイントです。与えられた問題に対しては、私の意見では「NOT IN」が良いアプローチです。 –

1

を使用してください。それぞれの写真が属するアルバムを返すことも意味があるようです。あなたが本当に写真のIDだけを望むなら、私の選択をSELECT DISTINCT p1.photoIDに置き換えることができます。

SELECT p1.albumID, p1.photoID, p2.photoID 
FROM PhotoInAlbum p1 
LEFT JOIN PhotoInAlbum p2 
    ON p1.photoID = p2.photoID AND p2.albumID = 0 
WHERE p2.photoID IS NULL; 

出力:ここ

enter image description here

デモ:

Rextester

0

使用サブクエリ

SELECT DISTINCT photoID FROM PhotoInAlbum WHERE photoID NOT IN (SELECT albumID FROM PhotoInAlbum) 
1

明らかに、写真はテーブル内で複数回出現することがありますが、写真のリスト(アルバム0には存在しないもの)を取得したいと思います。したがって、写真1行を取得するには、GROUP BYであなたの行を集約してください。あなたが条件 `ALBUMID <> 1 'のみをハードコーディングされているのはなぜこれだけ

select photoID 
from PhotoInAlbum 
group by photoID 
having count(case when albumID = 0 then 1 end) = 0; 
関連する問題