Select NOT IN multiple columns

前端 未结 4 1492
闹比i
闹比i 2020-12-12 18:03

I need to implement the following query:

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


        
相关标签:
4条回答
  • 2020-12-12 18:25

    Another mysteriously unknown RDBMS. Your Syntax is perfectly fine in PostgreSQL. Other query styles may perform faster (especially the NOT EXISTS variant or a LEFT JOIN), but your query is perfectly legit.

    Be aware of pitfalls with NOT IN, though, when involving any NULL values:

    • Find records where join doesn't exist

    Variant with LEFT JOIN:

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

    See @Michał's answer for the NOT EXISTS variant.
    A more detailed assessment of four basic variants:

    • Select rows which are not present in other table
    0 讨论(0)
  • 2020-12-12 18:28

    I use a way that may look stupid but it works for me. I simply concat the columns I want to compare and use NOT IN:

    SELECT *
    FROM table1 t1
    WHERE CONCAT(t1.first_name,t1.last_name) NOT IN (SELECT CONCAT(t2.first_name,t2.last_name) FROM table2 t2)
    
    0 讨论(0)
  • 2020-12-12 18:37

    You should probably use NOT EXISTS for multiple columns.

    0 讨论(0)
  • 2020-12-12 18:43

    I'm not sure whether you think about:

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

    it works only if id1 is related with id1 and id2 with id2 not both.

    0 讨论(0)
提交回复
热议问题