2016-02-25 146 views
0

我正在處理在特定條件下從多個表中繪製數據的查詢。結果集中的列必須包含1-3類地址的值。這是一個典型的1個贊助人到1,3個贊助人地址關係。基於其他值從多行中選擇相同的列

我的結果集中需要三個地址塊。 (這是一個系統轉換從ILS到另一個在我們的學術圖書館。)

每個人,從我所知道的,有ADDRESS_TYPE='1'PATRON_ADDRESS表中的行,這是一個街道地址

一些也有一個Address_Type = '2',這有時只是一個campusmailbox號碼,有時是一個真實地址

大多數有一個Address_Type = '3',這是電子郵件地址。 是的,我同意。這是源系統中糟糕的數據庫設計。

我有這樣一個數據結構,我需要填充:

PATRON name, primary address street city state zip (Address_type 1), secondary address street city state zip (Address_Type 2) and an email field. 

注意,而底層的數據庫是Oracle,在我目前的角色,我只能通過MS Access 2007中訪問數據(bleah!)。所以我可能知道我可以在Oracle中做的事情,我認爲它不適用於Access SQL。

因此,我需要從patron_id字段的同一表中抽取行,PATRON_ADDRESS。低於

此查詢對於每一個patron_IDaddress_typePatron表,我需要從Patron_Address表有條件地選擇列值。這個查詢是做我需要的嗎?

Select P.PATRON.P.PATRON_ID,P.PATRON.LAST_NAME, 

A1.StrretAddress_line1,A1.StreetAddress_Line2,etc.,A2.StreetAddress_Line1, A2.StreetAddress_Line2, A3.StreetAddress_Line1 

from PATRON P, PATRON_ADDRESS A1, PATRON_ADDRESS A2, PATRON_ADDRESS A3 

where (P.PATRON_ID = A1.PATRON_ID and 
     A1.ADDRESS_TYPE = '1') 
and 
    (P.PATRON_ID = A2.PATRON_ID and 
     A2.ADDRESS_TYPE = '2') 
and 
    (P.PATRON_ID = A3.PATRON_ID and 
     A3.ADDRESS_TYPE = '3'); 

我意識到,這將是相當低效的,但我不知道我怎麼會參考各個列,如果我做了一個內部聯接的PATRON_ADDRESSaddress type = 1數據,以及PATRON_ADDRESS涉及兩個外連接來獲得分別爲address type = 2address_type = 3數據。謝謝。

+0

你能澄清你的數據結構嗎? 「PATRON名稱,主要地址街道城市州郵政編碼(Address_type 1),次要地址街道城市州郵政編碼(Address_Type 2)和一個電子郵件字段。」那是4場?此外,您是否可以展示幾行示例數據和您期望的結果。 – JNevill

回答

1

您應該可以在JOIN表中爲每個地址。它與你所擁有的非常相似,但你真的應該使用JOIN語法,而不是列出FROM條款中的所有表格。這種形式的加入表格不清楚,不能完成JOIN條款可以實現的功能,並且在20年內一直在下降(已經下降)。

SELECT 
    P.patron_id, 
    P.last_name, 
    PA1.streetaddress_line1, 
    ... 
    PA2.streetaddress_line2, 
    ... 
    PA3.streetaddress_line3 
FROM 
    Patron P 
LEFT OUTER JOIN Patron_Address PA1 ON 
    PA1.patron_id = P.patron_id AND 
    PA1.address_type = '1' 
LEFT OUTER JOIN Patron_Address PA2 ON 
    PA2.patron_id = P.patron_id AND 
    PA2.address_type = '2' 
LEFT OUTER JOIN Patron_Address PA3 ON 
    PA3.patron_id = P.patron_id AND 
    PA3.address_type = '3' 

如果你知道每個人都有類型1的地址,那麼你可以做到這一點INNER JOIN

相關問題