如果存在INNER JOIN的元素,则将新列添加到SELECT

时间:2018-11-19 18:53:43

标签: sql hibernate

我有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 ...

2 个答案:

答案 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;

无论哪种情况,都只需要两个表。