2016-03-07 22 views
0

我有三個表:靠山,patron_address和patron_phone 爲每個顧客/所有父表中的行留下喬恩子表直接

贊助有1-3 Patron_address行 patron_address有0-4 我想顯示來自顧客表的所有行以及phone_type ='4'的所有電話號碼。

但是,當我使用下面的查詢時,我只會得到具有電話的行{類型爲4,而不是所有的顧客行。

我試圖讓Access 2007查詢設計器來做到這一點,但有些東西是非常糟糕的。 Patron_address行有一個address_type。只有address_type 1的patron_address行纔有子電話記錄。

那麼如何獲得所有的贊助人行,無論他們是否擁有phone_type 1的patron_phone?

SELECT 
    PATRON.patron_id, PATRON_PHONE.PHONE_TYPE, 
    PATRON_PHONE.PHONE_NUMBER, PATRON_ADDRESS.ADDRESS_TYPE 
FROM 
    (PATRON 
INNER JOIN 
    PATRON_ADDRESS ON PATRON.PATRON_ID = PATRON_ADDRESS.PATRON_ID) 
LEFT JOIN 
    PATRON_PHONE ON PATRON_ADDRESS.ADDRESS_ID = PATRON_PHONE.ADDRESS_ID 
WHERE 
    (((PATRON_PHONE.PHONE_TYPE) = '4')) 
ORDER BY 
    PATRON.patron_id; 

如果我補充一點,地址類型必須等於1的標準,我得到絕對沒有回來,儘管這個組合存在於數據庫中。是不是我想要左外連接點的行爲?謝謝。

回答

0

你有一個INNER JOIN贊助Patron_Addr。這意味着兩個表中都必須有匹配的記錄(通過PATRON_ID)返回一個值。

SELECT PATRON.patron_id, PATRON_PHONE.PHONE_TYPE, PATRON_PHONE.PHONE_NUMBER, PATRON_ADDRESS.ADDRESS_TYPE 
FROM PATRON 
INNER JOIN PATRON_ADDRESS ON PATRON.PATRON_ID = PATRON_ADDRESS.PATRON_ID 
LEFT JOIN PATRON_PHONE ON PATRON_ADDRESS.ADDRESS_ID = PATRON_PHONE.ADDRESS_ID 
WHERE PATRON_PHONE.PHONE_TYPE = 4 
ORDER BY PATRON.patron_id 

你有LEFT JOIN從地址表所以並不需要是一個電話號碼相匹配。

既然你過濾了的4手機類型,只會讓那些有電話記錄,其中PHONE_TYPE = 4

是您的手機類型字段輸入一個數字或文字記錄? SQL Server將嘗試來回轉換它們,但其他人可能不會,並給出錯誤或只是不匹配 - 我不記得Access如何處理這種情況。

如果您刪除PHONE TYPE條件,則您的地址條件應起作用。

如果你想獲得帕頓的所有記錄地址爲1,但只有那些TYPE = 4的電話號碼,改變WHERE PHONE_TYPE = 4到左側部分JOIN:

SELECT PATRON.patron_id, PATRON_PHONE.PHONE_TYPE, PATRON_PHONE.PHONE_NUMBER, PATRON_ADDRESS.ADDRESS_TYPE 
FROM PATRON 
INNER JOIN PATRON_ADDRESS ON PATRON.PATRON_ID = PATRON_ADDRESS.PATRON_ID 
LEFT JOIN PATRON_PHONE ON PATRON_ADDRESS.ADDRESS_ID = PATRON_PHONE.ADDRESS_ID AND PATRON_PHONE.PHONE_TYPE = 4 
WHERE PATRON_PHONE.ADDRESS_TYPE = 1 
ORDER BY PATRON.patron_id 

訪問SQL:

SELECT PATRON.patron_id, P_PHONE.PHONE_TYPE, P_PHONE.PHONE_NUMBER, PATRON_ADDRESS.ADDRESS_TYPE 
FROM PATRON 
INNER JOIN PATRON_ADDRESS ON PATRON.PATRON_ID = PATRON_ADDRESS.PATRON_ID 
LEFT JOIN [SELECT * FROM PATRON_PHONE WHERE PATRON_PHONE.PHONE_TYPE = 4 ]. AS P_PHONE ON PATRON_ADDRESS.ADDRESS_ID = P_PHONE.ADDRESS_ID 
WHERE PATRON_PHONE.ADDRESS_TYPE = 1 
ORDER BY PATRON.patron_id 

Access有子查詢的一些愚蠢的語法。您可以爲P_Phone子查詢創建一個單獨的查詢,但結果會(應該)相同。

+0

感謝您的建議。但是,patron_phone行只存在address_type 1的patron_address行。因此,無論電話號碼類型如何,修改後的連接都會爲我提供每個patron_phone行。我沒有遇到與拉取電話號碼的問題。數據以文本形式存儲。 – DocDuncan

+0

「AND PATRON_PHONE.PHONE_TYPE = 4」的** ON **條件會將電話號碼的結果限制爲鍵入** 4 **。 –

+0

謝謝。但是,Access對此表示說,LEFT JOIN PATRON_PHONE ON PATRON_ADDRESS.ADDRESS_ID = PATRON_PHONE。ADDRESS_ID和PATRON_PHONE.PHONE_TYPE =「4」,「不支持加入語法」。我從來沒有見過有多個ON子句的連接。 – DocDuncan

相關問題