Sql查询在多对多关系中查找不匹配的数据

时间:2013-01-02 09:19:49

标签: sql oracle

我在sql查询中需要帮助。

我有两张表Person_TablePersonAlias_Table。在第一个表中, person_id uniqe_id 是主键,在别名表中还有 person_id 和uniqe_id以及 activity_code 是主要的。我想找到Alias表不在人员表中的数据。

2 个答案:

答案 0 :(得分:2)

select *
  from PersonAlias_Table PA
       left outer join Person_Table P on PA.person_id = P.person_id 
       and PA.uniqe_id = P.uniqe_id
 where P.uniqe_id is null

试试这个

答案 1 :(得分:0)

执行此操作的最佳方式取决于您的DBMS,您可以使用NOT EXISTSLEFT JOIN/IS NULL

NOT EXISTS

SELECT  *
FROM    PersonAlias_Table pat
WHERE   NOT EXISTS
        (   SELECT  1
            FROM    Person_Table pt
            WHERE   pt.Person_ID = pat.Person_ID
            AND     pt.Uniqe_ID = pat.Uniqe_ID
        )

LEFT JOIN / IS NULL

SELECT  *
FROM    PersonAlias_Table pat
        LEFT JOIN Person_Table pt
            ON pt.Person_ID = pat.Person_ID
            AND pt.Uniqe_ID = pat.Uniqe_ID
WHERE    pt.Person_ID IS NULL

根据MySQL中的this answer NOT EXISTS效率稍低,在SQL Server LEFT JOIN / IS NULL中效率较低,在PostgreSQL和Oracle中两种方法都相同,所以它确实是个人偏好。