我有以下 3 个表:
Person TeamMember Provider
PersonId PersonName PersonId ProviderId IsLead ProviderId ProviderName
--------- ---------- -------- ------------ -------- ------------ --------
P1 ABC P1 PR1 Yes PR1 Provider1
P2 PQR P1 PR2 No PR2 Provider2
P1 PR3 No PR3 Provider3
-------------------------------
P2 PR1 No
P2 PR2 No
P2 PR3 No
我需要输出为(匹配 PersonId 和 IsLead = 'Yes'):
PersonId PersonName ProviderName
--------- ---------- ------------
P1 ABC Provider1
P2 PQR NULL
我在上面的 3 个表上使用了以下内部连接,但我在结果中得到了重复的行。
SELECT P.PersonID, P.PersonName,
CASE WHEN TM.IsLead = 'Yes' THEN Pr.ProviderName
WHEN TM.IsLead = 'No' THEN NULL END AS ProviderName
FROM Person P INNER JOIN TeamMember TM ON P.PersonID = TM.PersonID
INNER JOIN Provider PR ON Pr.ProviderId = TM.ProviderId
我尝试使用 distinct ,但即便如此也无济于事。
任何帮助将非常感激!
最佳答案
为了使您的解决方案正常工作,您需要使用 LEFT JOIN
并将 CASE 表达式移动到 JOIN 子句。我相信以下查询将满足您的需求。
您可以在 SQLFIDDLE 上查看示例.
SELECT
P.PersonID
,P.PersonName
,Pr.ProviderName
FROM Person P
LEFT JOIN TeamMember TM ON TM.PersonID = P.PersonID
AND TM.IsLead = 'Yes'
LEFT JOIN Provider PR ON Pr.ProviderId = TM.ProviderId
关于sql-server-2012 - SQL 中的内部联接返回重复的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23878117/