我有3个表PERSONS,COMPANIES和PERSON_CUSTOMER_COMPANY,如果某人是公司的客户(某人可能是与每个公司的其他关系),则该关系为n对n的关系。
此查询返回与作为客户的给定人员有关系的所有公司(第3行内部联接)。
select co.name from COMPANIES co
INNER JOIN PERSONS p on p.COMPANY_ID = co.id
INNER JOIN PERSON_CUSTOMER_COMPANY pcc on pcc.PERSON_ID = p.PERSON_ID
WHERE p.PERSON_ID = 123456;
我需要更改此查询以返回某人的所有公司,即使它们在PERSON_CUSTOMER_COMPANY和一个额外的字段(表明该人是否是该公司的客户)中不相关。
“ isCustomer”之类的东西
select co.name, isCustomer from COMPANIES co ...
答案 0 :(得分:1)
inner join
仅返回两个表中匹配的结果。由于您正在寻找在person_customer_company
表中没有记录的潜在公司,因此您需要一个outer join
来代替。然后,您可以使用case
语句创建新列:
SELECT co.name,
CASE WHEN pcc.Person_id IS NULL then 'No' else 'Yes' End as IsCustomer
FROM COMPANIES co
INNER JOIN PERSONS p on p.COMPANY_ID = co.id
LEFT JOIN PERSON_CUSTOMER_COMPANY pcc on pcc.PERSON_ID = p.PERSON_ID
WHERE p.PERSON_ID = 123456;
答案 1 :(得分:0)
我可能会使用exists
:
SELECT co.name,
(CASE WHEN EXISTS (SELECT 1
FROM PERSON p
WHERE p.COMPANY_ID = co.id AND
p.PERSON_ID = 123456
)
THEN 'Yes' ELSE 'No'
END) as IsCustomer
FROM COMPANIES co;
这仅使用PERSON
,因为这是您在查询中使用的JOIN
。
我怀疑您真的想要:
SELECT co.name,
(CASE WHEN EXISTS (SELECT 1
FROM PERSON_CUSTOMER_COMPANY pcc
WHERE pcc.COMPANY_ID = co.id AND
pcc.PERSON_ID = 123456
)
THEN 'Yes' ELSE 'No'
END) as IsCustomer
FROM COMPANIES co;
无论哪种情况,都只需要两个表。