2014-07-10 32 views
0

我有以下SQL來獲取員工的地址和其他信息。僅當所有列都爲空時才從其他表中選擇

SELECT 
    emp_id, 
    emp_name, 
    @addr1 = ISNULL(ma.addr1, ba.addr1), 
    @addr2 = ISNULL(ma.addr2, ba.addr2), 
    @addr3 = ISNULL(ISNULL(ma.addr3, ba.addr3),''), 
    @addr4 = ISNULL(ISNULL(ma.addr4, ba.addr4),''), 
    @addr5 = ISNULL(ISNULL(ma.addr5, ba.addr5),''), 
    @postCode = ISNULL(ma.postcode, ba.postcode) 
FROM dbo.employee e 
INNER JOIN MainAddress ma ON ma.AddressId=e.AddressId 
INNER JOIN SecondaryAddress ba ON ba.AddressId=e.AddressId 

問題是,當地址1或地址主其他字段爲NULL時,它將採取ADDR3或其他在輔助地址和示出了混合兩個地址。這是完全無效的。

當主地址中的所有字段都是NULL(不可用)時,如何獲得輔助地址?

注意:用戶可以更新這兩個表或只有一個表。

回答

3

如果「不被用」意味着在MainAddress表中沒有記錄,那麼ma.AddressId爲空,因此,您可以使用此條件爲每個字段:

CASE WHEN ma.AddressId IS NULL THEN ba.addr1 ELSE ma.addr1 END, 

如果你真的有檢查所有的字段都爲空,你必須改變這樣的案例情況:

CASE WHEN 
    ma.addres1 IS NULL AND ma.addres2 IS NULL ... 
    THEN ba.addr1 ELSE ma.addr1 END, 

注:如果有兩種可能的情況下,1,沒有排在所有,2,那該行存在,但值都是空,你需要檢查它像這樣:

ma.AddresId IS NULL OR (ma.addres1 IS NULL AND ma.addres2 IS NULL AND ...) 

正如評論所說,我忘了告訴你必須使用LEFT JOIN代替INNER JOIN。如果不是,如果任何地址表中的僱員沒有記錄,則該查詢不會返回該僱員的記錄。

順便說一句,如果你有一個地址表,並且有一個鑑別器列,它指定了地址類型:main或secondary,那將會容易得多。如果您這樣做了,則只需從員工表中選擇一個LEFT JOIN,並從地址表中獲取TOP 1。這會讓您的應用程序開發人員在許多其他情況下更容易,例如查看不知道是否主要的地址。

更新:使用CTE

對於OP評論,有必要使用長表達。爲了使它更清晰和可維護,CTE可以像這樣使用:

WITH ea AS -- the CTE, ea includes "employee + MainAdressExists column" 
(
SELECT 
    *, -- select the required columns 
    -- plus an extra calculated column 
    CASE WHEN 
     ma.address1 IS NOT NULL 
     OR ma.address2 IS NOT NULL 
     -- add here all the column checks 
    THEN 1 ELSE 0 END AS MainAddressExists 
FROM employee e 
LEFT JOIN MainAddres ma ON ma.IdAddress = e.IdAdress 
) 
SELECT 
    -- choose the needed fields from ea 
    CASE WHEN P.MainAddressExists = 1 THEN ma.addres1 ELSE ba.address1 END 
    AS address1, 
    -- choose all the other address fields 
FROM ea 
LEFT JOIN MainAddress ma ON ma.AddressId=e.AddressId 
LEFT JOIN SecondaryAddress ba ON ba.AddressId=e.AddressId 
+1

如果ma.IdAddress是NULL,那麼您將得不到結果。將'INNER JOIN'改爲'LEFT JOIN'。 – JodyT

+0

有時記錄不會在兩個表中都可用。這是問題 – Billa

+0

@Billa不,這不是問題。它有我給你的解決方案。我已經改進了我的答案,向你展示瞭如何使用CTE來縮短和清理它。 – JotaBe

相關問題