2015-04-07 112 views
0

我在DB三個表 - APPLICATIONAPPLICANTADDRESS一個一對多加入

有1行中APPLICATION

APPLICANT可以有1或2行通過APPLICATION_ID鏈接回APPLICATION

ADDRESS可以有1,2或3行通過APPLICANT_ID鏈接回APPLICANT

APPLICATION - >(1對多的上APPLICATION_ID) - >APPLICANT - >(1對多APPLICANT_ID) - >ADDRESS

我需要編寫一個查詢,其提取特定來自每個表的字段(從「所有信息」更改爲)1個結果集。結果需要在一個結果行中包含每個應用程序的所有可能的信息。有人能指點我的最佳解決方案嗎?

我希望問題很清楚。我已經通過SO進行了搜索,但只能真正找到一些特定案例的答案,並且沒有關於一對多連接的一般信息。

好的我認爲我應該詳細闡述一下,以幫助那些真正花時間思考這個問題的人。以下是所有三個表中的一些示例虛擬數據。

APPLICATION 
----------- 
APPLICATION_ID|APP1|APP2|OTHER_STUFF 
1    |1 |1 |x 

APPLICANT 
--------- 
APPLICANT_ID|APPLICATION_ID|FORENAME|OTHER_STUFF 
1   |1    |Homer |x 
2   |1    |Marge |x 

ADDRESS 
------- 
ADDRESS_ID|APPLICANT_ID|STREET   |OTHER_STUFF 
1   |1   |Sesame Street |x 
2   |1   |Evergreen Terrace|x 
3   |2   |Evergreen Terrace|x 

從SQL查詢會是這個樣子(希望)的結果;

APPLICATION_ID|APPLICANT_ID1|FORENAME1|ADDRESS_ID1|STREET1  |ADDRESS_ID2|STREET2   |APPLICANT_ID2|FORENAME_2|ADDRESS_ID3|STREET3 
1    |1   |Homer |1   |Sesame Street|2   |Evergreen Terrace|2   |Marge  |3   |Evergreen Terrace 

感謝

回答

1
; WITH applicants AS (
    SELECT applicant_id 
     , application_id 
     , forename 
     , other_stuff 
     , Row_Number() OVER (PARTITION BY application_id ORDER BY applicant_id) As sequence 
    FROM applicant 
) 
, addresses AS (
    SELECT address_id 
     , applicant_id 
     , street 
     , other_stuff 
     , Row_Number() OVER (PARTITION BY applicant_id ORDER BY address_id) As sequence 
    FROM address 
) 
SELECT application.application_id 
    , first_applicants.applicant_id As applicant_id1 
    , first_applicants.forename As forename1 
    , first_applicants_first_addresses.address_id As address_id1 
    , first_applicants_first_addresses.street As street1 
    , first_applicants_second_addresses.address_id As address_id2 
    , first_applicants_second_addresses.street As street2 
    , second_applicants.applicant_id As applicant_id2 
    , second_applicants.forename As forename2 
    , second_applicants_first_addresses.address_id As address_id3 
    , second_applicants_first_addresses.street As street3 
    , second_applicants_second_addresses.address_id As address_id4 
    , second_applicants_second_addresses.street As street4  
FROM application 
LEFT 
    JOIN applicants As first_applicants 
    ON first_applicants.application_id = application.application_id 
    AND first_applicants.sequence = 1 
LEFT 
    JOIN addresses As first_applicants_first_addresses 
    ON first_applicants_first_addresses.applicant_id = first_applicants.applicant_id 
    AND first_applicants_first_addresses.sequence = 1 
LEFT 
    JOIN addresses As first_applicants_second_addresses 
    ON first_applicants_second_addresses.applicant_id = first_applicants.applicant_id 
    AND first_applicants_second_addresses.sequence = 2 
LEFT 
    JOIN applicants As second_applicants 
    ON second_applicants.application_id = application.application_id 
    AND second_applicants.sequence = 2 
LEFT 
    JOIN addresses As second_applicants_first_addresses 
    ON second_applicants_first_addresses.applicant_id = second_applicants.applicant_id 
    AND second_applicants_first_addresses.sequence = 1 
LEFT 
    JOIN addresses As second_applicants_second_addresses 
    ON second_applicants_second_addresses.applicant_id = second_applicants.applicant_id 
    AND second_applicants_second_addresses.sequence = 2 
WHERE application.application_id = 1 
; 
+0

魔術隊友!我不會假裝我理解它,但我已經嘗試了一下,它的運行方式正是我希望的。我知道這是一個非常具體的問題和答案,但希望其他人也會發現它有用。 – Urbley

0
select APPLICATION.*, APPLICANT.*, ADDRESS.* 
    from APPLICATION 
    join APPLICANT 
    on APPLICATION.APPLICATION_ID = APPLICANT.APPLICATION_ID 
    join ADDRESS 
    on APPLICANT.APPLICATION_ID = APPLICANT.APPLICATION_ID 
+0

Blam我很欣賞超級快速的回覆,但問題在技術上並不準確。我正試圖編輯它,在有人進來之前:P更新傳入... – Urbley

2

你一定會得到它與下面的查詢工作。希望這可以幫助你。

SELECT * FROM應用程序作爲應用程序

INNER JOIN申請人A1上A1.APPLICATION_ID = App.APPLICATION_ID

INNER JOIN地址A2上A2.APPLICANT_ID = A1.APPLICANT_ID