我正在尝试调整查询中包含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
,当我将其更改为正确的查询时,它给了我正确的结果。
答案 0 :(得分:2)
SELECT pe.id
FROM SHOP.person pe
WHERE EXISTS (
SELECT *
FROM SHOP.contactperson cp
WHERE cp.personid = pe.id
AND cp.companyid = 5
);
答案 1 :(得分:1)
您的join子句未使用与原始查询相同的字段。您应该使用联系人表格中的personid。
SELECT person.id
FROM SHOP.person
Join SHOP.contactperson
ON person.id = contactperson.personid
WHERE contactperson.companyid = 5;