【发布时间】:2016-11-29 20:46:22
【问题描述】:
请帮忙 - 我正在为不应该是一个困难的查询而发疯。 我正在使用 sql server 2012 并希望使用电子邮件地址列出我的客户。
我有一个包含默认电子邮件地址的客户表和一个包含此人的电子邮件地址的联系人表。每个客户可能有多个联系人,也可能没有。联系人可以有多种用途,并且在 ContactDocumentOption 表中针对每种用途都有一个条目。我只对 purposetype = 102 的联系人感兴趣
对于每个客户,我想显示类型 102 联系人的电子邮件地址(如果有多个联系人,则为第一个联系人,或者尽管有任何联系人都可以)。如果没有 102 类联系人,那么我想显示客户的默认电子邮件地址。
除非碰巧是该客户的第一个联系人,否则以下查询不会获取联系人电子邮件,如果客户有两个联系人并且第一个不是 102 类型,则联系人电子邮件为空
SELECT C.Code as Customer
, C.Name as CustomerName
, C.Email
, CC.Email
, ISNULL(CC.Email, C.Email) as Email
FROM [dr].[Customer] C
LEFT OUTER JOIN
(
Select TOP 1 CDO.ContactId
, CustomerId
, Email
from dr.Contact CC
INNER JOIN dr.ContactDocumentOption CDO on CDO.ContactId = CC.ContactId
where CDO.TransactionTypeId = 102
Order by Email
) CC on CC.CustomerId = C.CustomerId
认为这是因为 TOP 1 在确定它是 102 之前仅获得了最高联系人,因此我将查询更改为以下内容,但结果相同。
SELECT C.Code as Customer
, C.Name as CustomerName
, C.Email
, CC.Email
, ISNULL(CC.Email, C.Email) as Email
FROM [dr].[Customer] C
LEFT OUTER JOIN
(
SELECT CustomerId
, CT.ContactId
, Email
from dr.Contact CT
INNER JOIN
(
Select TOP 1 ContactId from dr.ContactDocumentOption
where TransactionTypeId = 102
) CDO on CDO.ContactId = CT.ContactId
) CC on CC.CustomerId = C.CustomerId
我确实从之前的帖子中获得了一些帮助,但没有任何效果,所以我正在寻求进一步的帮助。谢谢。
【问题讨论】:
-
SELECT TOP 1 会将结果集限制为查询返回的第一条记录。
-
不要害怕在查询中使用一些空格。那些东西让我的眼睛流血了。
-
一些相同的数据和所需的输出将大大有助于理解您正在尝试做什么。这是一个很好的起点。 spaghettidba.com/2015/04/24/…
标签: sql-server nested