web-dev-qa-db-ja.com

NOT IN multiple columnsを選択します

次のクエリを実装する必要があります

SELECT * 
FROM   friend 
WHERE  ( friend.id1, friend.id2 ) 
         NOT IN (SELECT id1, 
                        id2 
                 FROM   likes) 

nOT INは複数の列に実装できません。このクエリを記述する方法

60
Gunjan Nigam

あなたが考えるかどうかはわかりません:

select * from friend f
where not exists (
    select 1 from likes l where f.id1 = l.id and f.id2 = l.id2
)

id1がid1とid2に関連し、id2が両方ではない場合にのみ機能します。

86
Michał Powaga

もう1つの不思議な未知のRDBMS。 PostgreSQLの構文はまったく問題ありません。他のクエリスタイル(特にNOT EXISTSバリアントまたはLEFT JOIN)はより高速に実行できますが、クエリは完全に正当です。

ただし、NULL値を使用する場合は、NOT INの落とし穴に注意してください。

LEFT JOINのバリアント:

SELECT *
FROM   friend f
LEFT   JOIN likes l USING (id1, id2)
WHERE  l.id1 IS NULL;

NOT EXISTSバリアントについては、@Michałの回答を参照してください。
4つの基本的なバリアントのより詳細な評価:

18