【问题标题】:SQL JOIN EXPLANATIONSQL 连接说明
【发布时间】:2019-08-03 02:30:24
【问题描述】:

谁能解释这里发生了什么?该查询在第二个左连接期间使用“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 条件可以包含任何布尔条件,包括子查询。
  • 欢迎蒂鲁文加丹! “in”不是连接,是子查询。
  • 欢迎来到 StackOverflow。您的问题很少见:1)不要使用大写锁定,它非常具有攻击性。 2)请正确格式化您的查询,一行不在代码块中,并且您有无用的空格 3)突出显示相关子句,以便读者无需找出您在说哪个IN。最后,SP_as_PR.PRroviderID in (...),请查看w3schools.com/Sql/sql_in.asp
  • IsSponsor 属于哪个表?

标签: sql sql-server sql-server-2008 join left-join


【解决方案1】:

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

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

我本以为会看到类似的东西

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

【讨论】:

    【解决方案2】:

    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 中,请移动它所属的条件。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-29
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多