94

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

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

ただしNOT IN、複数の列に実装することはできません。このクエリの書き方

4

4 に答える 4

122

次のことを考えているかどうかわかりません。

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 に関連付けられている場合にのみ機能します。

于 2011-11-07T07:12:19.957 に答える
22

別の不可解な未知の RDBMS。あなたの構文はPostgreSQLで完全に問題ありません。他のクエリ スタイル (特にNOT EXISTSバリアントまたは a LEFT JOIN) はより高速に実行される可能性がありますが、クエリは完全に正当です。

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

LEFT JOIN を使用したバリアント:

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

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

于 2011-11-07T07:18:57.243 に答える
-1

おそらくNOT EXISTS複数の列に使用する必要があります。

于 2011-11-07T07:10:00.603 に答える