簡體   English   中英

從嵌套的SQL選擇中選擇一條記錄

[英]Select one record from a nested 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'

好吧,這很難理解您的問題,但是我想您有同一客戶的多行,但不是每一行的電子郵件列中都有值,對嗎?

為此,您應該嘗試在SQL字符串中包括WHERE Email IS NOT NULLTOP 1的部分不錯,但是請嘗試使用Email IS NOT NULL使SQL語句僅在找到電子郵件時才返回值。

希望我能理解您的問題,對您有幫助。

您是否嘗試過直接向第二個請求左加入而不是使用嵌套請求? 然后您對主要請求采取TOP 1? 如果您有SQL提琴,將更容易提供幫助。

您可以使用[SQL Row_Number() function][1]和其他Partition By子句合並來自Contacts的數據,如下所示

請注意,不是使用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()函數是一種根據字段可為空的情況比較兩個字段的更好方法

輸出如下

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM