2016-01-29 44 views
0

我正在使用SQL Server,並且遇到困難時試圖從我想要的SELECT查詢中獲得結果。我已經選擇從3個表如下記錄:從多個帶有OR條件的表中選擇

客戶端(clientID的,姓名,年齡,出生日期)

地址(clientID的,城市,街道)

電話(客戶端ID,personalPhone,officePhone, homePhone)

在我的輸入中,我可以有(dateOfBirth,steet,homePhone),我需要結果中的Disntinct ClientIDs。這些輸入值是可選的。它不是強制性的,每次所有這些輸入值都有價值,在某些情況下,只有街道和家庭電話被提供,或者有時只有街道被提供。

參數中有「OR」關係!就像我傳遞homePhone一樣,那麼記錄(S)應該返回。

+0

什麼是你目前的SELEC T聲明看起來像? – durbnpoisn

+3

'我正在使用SQL Server' - 爲什麼MySQL和Oracle標記? – symcbean

+0

SELECT clientID的FROM CLIENT.CLIENT其中出生日期=:出生日期 相交 SELECT clientID的FROM CLIENT.Address其中街僅=:街道 相交 SELECT clientID的FROM client.Phone其中HOMEPHONE =:HOMEPHONE –

回答

0

這是幾乎相同Mureinik的答案,但他並沒有使用左外連接,所以如果你有一個客戶有一個地址,但沒有一個電話號碼,他們會從結果集,除非你使用一個外被排除加入:

SELECT DISTINCT client_id 
FROM client c 
LEFT OUTER JOIN address a 
    ON c.client_id = a.client_id 
LEFT OUTER JOIN phone p 
    ON c.client_id = p.client_id 
WHERE (@date_of_birth IS NULL OR c.date_of_birth = @date_of_birth) AND 
     (@street IS NULL OR @street = a.street) AND 
     (@home_phone IS NULL OR @home_phone = p.home_phone) 
+0

它沒有工作,我測試它只輸入home_phone並沒有記錄返回時,實際上有一個記錄存在與此home_phone電話表:( –

+0

如果用戶不包括這些值是否傳遞空值 - 或你只是傳遞空字符串?你想確保它們是空的 - 或者你必須改變條件邏輯爲(@date_of_birth =''或c.date_of_birth = @date_of_birth)。但是發送空值。比檢查更好爲空的字符串 –

+0

離開週末我將在星期一標記這個問題和答案,如果仍然沒有解決 –

0

您可以使用or條件將邏輯短路。讓我們假設你表示有@參數:

SELECT DISTINCT client_id 
FROM  client c 
LEFT JOIN address a ON c.client_id = a.client_id 
LEFT JOIN phone p ON c.client_id = p.client_id 
WHERE  (@date_of_birth IS NULL OR c.date_of_birth = @date_of_birth) AND 
      (@street IS NULL OR @street = a.street) AND 
      (@home_phone IS NULL OR @home_phone = p.home_phone) 
+0

您應該使用左外連接,因爲您的查詢將排除地址或電話號碼丟失的記錄。鑑於帖子中的信息有限,我們不知道是否需要電話號碼和地址才能插入客戶端記錄。 –

+0

客戶端表中可能有一些客戶端記錄中沒有地址或電話號碼錶中的記錄的記錄。 –

+0

好點 - 編輯使用「左連接」的答案。 – Mureinik

0

標準的方式,你有空默認爲「全部」或通配符是這樣的:

SELECT * 
FROM client c 
LEFT JOIN address a ON c.client_id = a.client_id 
LEFT JOIN phone p ON c.client_id = p.client_id 
WHERE (COALESCE(@date_of_birth,c.date_of_birth) = c.date_of_birth 
    OR COALESCE(@street,c. a.street) = a.street 
    OR COALESCE(@home_phone,p.home_phone) = p.home_phone) 
-- Put the following line in if you want at least one parameter to not be null 
AND COALESCE(@date_of_birth,@street,@home_phone) is not null