SQL JOIN EXPLANATION

问题描述 投票:-7回答:2

任何人都可以解释这里发生了什么?查询在第二个左连接期间使用“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'
      )
sql sql-server sql-server-2008 join left-join
2个回答
0
投票

正如人们在评论中所说,ON是一个子查询。它看起来特别难看,因为第二个左连接的条件与第一个表没有任何直接关系。

因此,编码人员要求将提供者表与表中赞助商的所有提供者一起带回。这意味着可能会有多个匹配placement_detail,因此有许多重复的行。

我本以期待看到类似的东西

ON PDT.Provider_ID=SP_as_PR.Provider_ID AND SP_as_PR.Priovide_ID IN (...

0
投票

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中没有重复的提供者/赞助者元组,你也可以加入该表。 (INEXISTS条款只是有意义,以避免重复。)

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是否位于ProviderSponsorProvider。在我的查询中,我认为它在ProviderSponsor。如果它在Provider中,则移动它所属的条件。)

© www.soinside.com 2019 - 2024. All rights reserved.