任何人都可以解释这里发生了什么?查询在第二个左连接期间使用“IN”条件而不是“ON”条件。连接中“IN”条件有什么作用?
SELECT
*
FROM
PlacementDetail_Temp PDT
LEFT JOIN
dbo.[Authorization] AUTH
on AUTH.PlacementDetailID = PDT.PlacementDetailID
and AUTH.PayorID = @PayorID
LEFT JOIN
dbo.Provider SP_as_PR
on SP_as_PR.ProviderID in
(
Select
PR.ProviderID
from
dbo.Provider PR
INNER JOIN
dbo.ProviderSponsor PS
ON PR.ProviderID = PS.ProviderID
and PS.SponsorID = AUTH.SponsorID
where
IsSponsor = 'True'
)
正如人们在评论中所说,ON是一个子查询。它看起来特别难看,因为第二个左连接的条件与第一个表没有任何直接关系。
因此,编码人员要求将提供者表与表中赞助商的所有提供者一起带回。这意味着可能会有多个匹配placement_detail,因此有许多重复的行。
我本以期待看到类似的东西
ON PDT.Provider_ID=SP_as_PR.Provider_ID AND SP_as_PR.Priovide_ID IN (...
ON
子句包含Provider
行连接到Authorization
行的条件。在你的情况下,这个条件是IN
条款。 IN
条款通常不相关,但你的是,这没有错,但那么使用EXISTS
更典型。此外,子查询中的Provider
是多余的,这使得该条款更具可读性。
该查询试图做的是:
LEFT JOIN dbo.provider pr ON (pr.providerid, auth.sponsorid) IN
(
SELECT providerid, sponsorid
FROM dbo.providersponsor
WHERE issponsor = 'true'
)
但SQL Server不允许像其他DBMS那样在IN
子句中使用元组。通过缩短的条款,您可以看到我们与赞助商一起加入所有提供商。
如果在ProviderSponsor
中没有重复的提供者/赞助者元组,你也可以加入该表。 (IN
或EXISTS
条款只是有意义,以避免重复。)
SELECT *
FROM placementdetail_temp pdt
LEFT JOIN dbo.authorization auth ON auth.placementdetailid = pdt.placementdetailid
AND auth.payorid = @payorid
LEFT JOIN dbo.providersponsor ps ON ps.sponsorid = auth.sponsorid AND ps.issponsor = 'True'
LEFT JOIN dbo.provider pr ON pr.ProviderID = ps.ProviderID;
(从您的查询中不清楚IsSponsor
是否位于ProviderSponsor
或Provider
。在我的查询中,我认为它在ProviderSponsor
。如果它在Provider
中,则移动它所属的条件。)