5

私はいくつかの同様の質問を見てきましたが、以下の問題の正しい解決策に出くわしたり、見つけたりすることはまだできていません。

次の3つのテーブルがあるとします。

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です。

複数の結合は常に私を投げます。

考え?

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 に答える