2016-11-29 73 views
0

幫助 - 我已經在這個問題上玩了一段時間,並且會去蝙蝠。 在此縮減查詢中,我想從聯繫人列表中選擇一個可能包含該客戶的多個聯繫人的單個電子郵件地址。從嵌套的sql select中選擇一條記錄

我的問題是,它沒有找到聯繫人電子郵件,如果我指定TOP 1 (用於CC.Email顯示NULL)

注:返回與聯繫電子郵件兩條記錄,如果我指定TOP 5

我認爲TOP 1必須在確定匹配之前將記錄限制爲1嗎?

SELECT C.Code as Customer, C.Name as CustomerName, C. Email, CC.Email, IIF(CC.Email<>'',CC.Email,C.Email) as Email 
FROM [dr].[Customer] C 
LEFT OUTER JOIN (Select TOP 1 CustomerId, Email 
        from dr.Contact CC 
        INNER JOIN dr.ContactDocumentOption CDO 
        on CDO.TransactionTypeId = 102 
         AND CDO.ContactId = CC.ContactId 
        Order by CC.ContactId) CC 
    on CC.CustomerId = C.CustomerId 
WHERE C.Code = 'B82' 
+0

請提供DBMS,樣本數據和預期數據。 – Viki888

+0

我正在使用SQL Server 2012 - 我的客戶表有許多客戶,其中包括'B82'和我的聯繫人表有2個客戶記錄。 – Anthonyinnz

+0

我試圖爲每個客戶檢索一行,顯示第一個聯繫人的電子郵件,或者如果沒有聯繫人,則顯示默認的公司電子郵件。 – Anthonyinnz

回答

0

嗯,這是一個有點難以明白你的問題,但我猜你有相同的客戶多行,但不是每行中的電子郵件列有價值觀,是嗎?

對此,您應該嘗試在您的SQL字符串中包含WHERE Email IS NOT NULLTOP 1的部分很好,但只有在發現電子郵件時才使用SQL語句返回值,並使用Email IS NOT NULL。

我希望我明白你的問題,這可以幫助你。

+0

是的 - 但我想要返回客戶詳細信息,即使沒有電子郵件。有些客戶沒有聯繫人,有些客戶有不止一個。如果有聯繫人我想使用第一個聯繫人電子郵件,並且沒有聯繫人,我想使用客戶公司的默認電子郵件。 – Anthonyinnz

+0

好的,那麼你可以添加'CASE WHEN Email NOT NULL THEN Email ELSE CompanyEmail END AS email',根據你的需要進行更改。 –

0

您是否嘗試過直接連接第二個請求而不是使用嵌套請求?然後你在主要要求上取得第一名? 如果你有一個SQL小提琴,它會更容易幫助。

+0

就我的簡化查詢而言,您是正確的.....但我確實希望所有符合其他條件的客戶都滿意,主要要求中的TOP 1當然只會給我一個客戶。 – Anthonyinnz

0

您可以[SQL Row_Number() function][1]和額外的分區從通訊錄中的數據結合起來By子句如下

請注意,而不是TOP,我用ROW_NUMBER的功能和使用的結果在WHERE子句中使用RN = 1選擇頂部1

;with cte as (
select 
    c.Code as Customer, c.Name as CustomerName, c.Email CustomerEmail, cc.Email ContactEmail, 
    rn = ROW_NUMBER() over (partition by c.CustomerId order by cc.Email desc) 
from Customer c 
left join Contact cc on c.CustomerId = cc.CustomerId 
left join ContactDocumentOption o on o.TransactionTypeId = 102 
           and o.ContactId = cc.ContactId 
where c.Code = 'B82' 
) 
select Customer, CustomerName, ISNULL(ContactEmail,CustomerEmail) Email 
from cte where rn = 1 

ISNULL()函數是一個更好的方式來比較根據該字段的null的殼體的一個兩個字段

輸出如下

enter image description here

+0

謝謝Eralper - 這似乎工作。我還沒有在 – Anthonyinnz

+0

Damm之前使用過這些概念 - 當我停止將其限制給一個客戶時 - 測試顯示您的解決方案將返回來自任何客戶聯繫人的電子郵件,當我只需要包含TransactionTypeId = 102的聯繫人時。 ..如果我將其更改爲內部聯接ContactDocumentOption,那麼我當然不會得到所有客戶(只有那些有聯繫人) – Anthonyinnz

+0

嗨,聯接應該解決問題,因爲您已經建議 – Eralper