内连接中的TOP 1不会给出预期的结果

时间:2016-11-29 20:46:23

标签: sql-server nested

请帮忙 - 我对这不应该是一个困难的查询感到困惑。 我正在使用sql server 2012,并希望用电子邮件地址列出我的客户。

我有一个Customer表,其中包含一个默认电子邮件地址,以及一个包含该人员电子邮件地址的联系人表。每个客户可能有多个联系人,或者他们可能没有联系人。联系人可以用于多种目的,并且在ContactDocumentOption表中为每个目的都有一个条目。我只对有目的类型= 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 

认为这是因为在确定它是102之前,TOP 1只获得了顶级联系人我将查询更改为以下内容,但结果相同。

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

我确实从之前的帖子中得到了一些帮助,但没有任何效果,所以我正在寻求进一步的帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

如果不了解有关表格或数据的更多信息,很难回答这个问题,但这样的事情会让你开始吗?
在cte中:
使用COUNT()OVER()来确定联系人是否具有102 TransTypeID 如果没有TransType 102,则允许您仅抓取1封电子邮件的行数 然后联合具有TransType 102且记录不包含的记录。

;WITH cte as (
 Select CDO.ContactId,
        CustomerId,
        Email,
        CDO.TransactionTypeId,
        COUNT(CASE WHEN TransactionTypeId = 102 THEN 1 ELSE 0 END) OVER (PARTITION BY Customerid) AS cnt,  
        ROW_NUMBER() OVER(PARTITION BY CustomerId ORDER BY TransactionTypeId ASC) as rn
from dr.Contact CC   
INNER JOIN dr.ContactDocumentOption CDO 
      ON CDO.ContactId = CC.ContactId 
)  
SELECT CDO.ContactId, 
       CustomerId, 
       Email,
       CDO.TransactionTypeId
FROM cte c
WHERE TransactionTypeId = 102 
UNION 
SELECT CDO.ContactId, 
       CustomerId, 
       Email,
       CDO.TransactionTypeId
FROM cte c
WHERE cnt = 0 and rn = 1