5

我已经查看了许多类似的问题,但尚未偶然发现/找到以下问题的正确解决方案。

给定以下三个表:

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,否则为空。

多个连接总是让我失望。

想法?

4

2 回答 2

6

尝试左连接:

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 = ?
于 2012-09-08T15:47:55.813 回答
3

由于您要提取独立于舞台表的所有信息(舞台表上没有匹配项),因此最适合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 JOINLEFT JOIN,即使右表中没有匹配项,也返回左表中的所有记录或之前的所有记录。

于 2012-09-08T15:50:08.987 回答