web-dev-qa-db-ja.com

SQLの内部結合は重複行を返します

私は次の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

私は別のものを使おうとしましたが、それでも役に立ちませんでした。

どんな助けでも大歓迎です!

5
Maltesh

ソリューションが正しく機能するためには、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
4
NickyvV