帮助 - 我已经有一段时间了解这个并且正在蝙蝠。 在此缩减查询中,我想从联系人列表中选择一个可能包含该客户的多个联系人的电子邮件地址。
我的问题是,如果我指定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 :(得分:0)
嗯,有点难以理解你的问题,但我想你有同一个客户的多行,但不是每一行都有电子邮件列中的值,我是对的吗?
为此你应该尝试在你的SQL字符串中包含WHERE Email IS NOT NULL
,TOP 1
的部分是好的,但是只有在找到电子邮件时才尝试使SQL语句返回值,使用Email IS NOT NULL。
我希望我理解你的问题,这对你有帮助。
答案 1 :(得分:0)
您是否尝试过直接LEFT JOIN第二个请求而不是使用嵌套请求?然后你在主要要求上取得TOP 1? 如果你有一个SQL小提琴,它会更容易帮助。
答案 2 :(得分:0)
您可以将来自联系人的数据与[SQL Row_Number() function][1]
和其他Partition 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()函数是根据字段的可空案例之一比较两个字段的更好方法
输出如下