0

我正在尝试调整查询中包含 IN 子句的 SQL 查询。

我尝试用 Join 替换 IN 并查看了查询计划。两者在执行时间上看起来相似,但结果不同。有人可以帮我解决这个问题吗?我在 pgadmin III 中使用商店数据库。提前致谢。原始查询:

SELECT person.id
FROM   SHOP.person
WHERE  person.id IN (SELECT personid
                     FROM   SHOP.contactperson
                     WHERE  companyid = 5); 

SELECT person.id
FROM   SHOP.person
       JOIN SHOP.contactperson
         ON person.id = contactperson.id
WHERE  contactperson.companyid = 5; 

编辑:现在这个查询返回正确的结果:

SELECT person.id
FROM   SHOP.person
       JOIN SHOP.contactperson
         ON person.id = contactperson.personid
WHERE  contactperson.companyid = 5;

我使用contactperson.id而不是contactperson.id,当我将其更改为正确的查询时,它给了我正确的结果。

4

2 回答 2

2
SELECT pe.id
FROM   SHOP.person pe
WHERE  EXISTS (
   SELECT *     
   FROM   SHOP.contactperson cp
   WHERE cp.personid = pe.id
   AND  cp.companyid = 5
   ); 
于 2014-01-05T15:07:15.633 回答
1

您的联接子句未使用与原始查询相同的字段。您应该使用联系人表中的 personid。

SELECT person.id
FROM SHOP.person 
Join SHOP.contactperson
ON person.id = contactperson.personid 
WHERE contactperson.companyid = 5;
于 2014-01-05T15:01:11.747 回答