我看了很多类似的问题,但还没有发现/找到解决问题的正确方法。
给出以下三个表:
account
profile_id number (nullable)
bill_acct varchar
status varchar (nullable)
remarks varchar (nullable)
stage
ecpd_profile_id number (nullable)
bill_account varchar (nullable)
account_class varchar (nullable)
profile
ecpd_profile_id number
reg_prof_id number
我需要创建一个连接来选择以下内容:
account.bill_act, account.status, account.remarks, stage.account_class
,其中
profile.ecpd_profile_id = (given number)
account.profile_id
和profile.reg_prof_id
等效
stage.ecpd_profile_id
和profile.ecpd_profile_id
等效
stage.bill_acct
和account.bill_acct
等效
我尝试了以下内容......
select
account.bill_acct,
account.status,
account.remarks,
stage.account_class
from
registration_account account
join registration_profile profile
on account.profile_id = profile.reg_prof_id
join acct_stg stage
on stage.ecpd_profile_id = profile.ecpd_profile_id
and stage.bill_acct = account.bill_acct
where
profile.ecpd_profile_id = ?
这样可行,但不包括舞台上没有匹配的所有帐户条目。
我需要拥有account.bill_acct=stage.bill_acct
的所有行,为其中存在的stage.account_class
附加一列,否则为null。
多个连接总是抛弃我。
思想?
答案 0 :(得分:5)
尝试左连接:
select
account.bill_acct,
account.status,
account.remarks,
stage.account_class
from
registration_account account
left join registration_profile profile
on account.profile_id = profile.reg_prof_id
left join acct_stg stage
on stage.ecpd_profile_id = profile.ecpd_profile_id
and stage.bill_acct = account.bill_acct
where
profile.ecpd_profile_id = ?
答案 1 :(得分:2)
由于您想要独立于舞台表格提取所有信息(舞台表格中没有匹配项),最适合以下列方式使用LEFT JOIN
:
SELECT
account.bill_acct,
account.status,
account.remarks,
stage.account_class
FROM
registration_account account
JOIN registration_profile profile
ON account.profile_id = profile.reg_prof_id
LEFT JOIN acct_stg stage
ON stage.ecpd_profile_id = profile.ecpd_profile_id
and stage.bill_acct = account.bill_acct
WHERE
profile.ecpd_profile_id = ?
LEFT JOIN
会返回左表中的所有记录或LEFT JOIN,
之前的所有记录,即使右表中没有匹配项也是如此。