单个SQL查询,用于查找某个键存在值但不存在另一个给定键的行

时间:2010-06-25 17:44:18

标签: sql

希望标题足够清晰!我正在寻找一个复制下一个功能的单个查询,但不使用子查询:

select p_id from a_p 
 where a_id=1 
   and p_id not in (select p_id from a_p where a_id=2)

例如,表a_p具有以下行:

a_id | p_id
1    | 1
1    | 2
2    | 2

这里,p_id 1出现在a_id 1但不是a_id 2 - 上面的查询只返回p_id 1.有什么想法吗?

1 个答案:

答案 0 :(得分:1)

无法使用子查询,这使您使用LEFT OUTER JOIN / IS NULL:

   SELECT a.p_id
     FROM A_P a
LEFT JOIN A_P b ON b.p_id = a.p_id
               AND b.a_id = 2
    WHERE a.a_id = 1
      AND b.p_id IS NULL

请注意,所有数据库供应商的子查询性能都不相同。在PostgreSQL和Oracle中,NOT IN,NOT EXISTS和LEFT JOIN / IS NULL都是等价的。只有在MySQL中,LEFT JOIN / IS NULL才更有效。