SQL ОБЪЯСНЕНИЕ ОБЪЯСНЕНИЯ - PullRequest
0 голосов
/ 12 марта 2019

Кто-нибудь может объяснить, что здесь происходит?Запрос использует условие «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'
      )

Ответы [ 2 ]

0 голосов
/ 12 марта 2019

Предложение 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 не позволяеткортежи в предложении 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, переместите условие в соответствующее место.)

0 голосов
/ 12 марта 2019

Как говорили люди в комментариях, ON - это подзапрос. Это выглядит особенно уродливо, поскольку условия для второго левого соединения не имеют прямого отношения к первой таблице.

Таким образом, кодер просит вернуть таблицу поставщиков со всеми поставщиками в таблице, которые являются спонсорами. Это означает, что потенциально может быть несколько совпадений для размещения_детали и, следовательно, много повторяющихся строк.

Я бы ожидал увидеть что-то вроде

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