使用第三个作为链接表连接两个表,包括空条目

时间:2012-09-08 15:43:56

标签: sql oracle join ansi-sql

我看了很多类似的问题,但还没有发现/找到解决问题的正确方法。

给出以下三个表:

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_idprofile.reg_prof_id等效

stage.ecpd_profile_idprofile.ecpd_profile_id等效

stage.bill_acctaccount.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。

多个连接总是抛弃我。

思想?

2 个答案:

答案 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,之前的所有记录,即使右表中没有匹配项也是如此。