3

現在、SQLで結合が失敗している値を把握するには、次の方法を使用します

SELECT DISTINCT ACC.Name
     ,ACC.Area
     ,CASE
          WHEN A.Area IS NULL AND N.Name IS NULL
               THEN 'Name and Area do not match'
          WHEN A.Area IS NULL 
               THEN 'Area does not match'
          WHEN N.Name IS NULL
               THEN 'Name is null'
          ELSE 
               'Yes'
          END as IsTopAccount
 FROM Test.dbo.Accounts ACC
 LEFT JOIN Test.dbo.TopAccounts A ON A.Area = ACC.Area
 LEFT JOIN Test.dbo.TopAccounts N ON N.Name = ACC.Name

上記では、アカウントはTopAccountsエリアと名前の両方でテーブルに結合されている必要があります。2つの結合は、caseステートメントの各条件をテストするために必要です。

LEFT JOINおそらく2つの別々のの代わりに1つを使用して、caseステートメントの各条件をより効率的にテストすることは可能LEFT JOINですか?

このSQLフィドルを参照してください

4

3 に答える 3

3

私はこれがうまくいくと思います:

SELECT ACC.Name
     ,ACC.Area
     ,CASE
          WHEN T.Area IS NULL AND T.Name IS NULL
               THEN 'Not matching at all'
          WHEN T.Area != ACC.Area
               THEN 'Matching for name only'
          WHEN T.Name != ACC.Name
               THEN 'Matching for area only'
          ELSE 
               'Yes'
          END as IsTopAccount
 FROM A ACC
         LEFT JOIN TA T ON T.Area = ACC.Area 
                                        OR T.Name = ACC.Name
于 2013-02-21T17:38:54.717 に答える
2

あなたは多分2つでそれをすることができます:

SELECT ACC.Name
     ,ACC.Area
     ,CASE
          WHEN A.Area IS NULL AND N.Name IS NULL
               THEN 'Name and Area do not match'
          WHEN A.Area IS NULL 
               THEN 'Area does not match'
          WHEN N.Name IS NULL
               THEN 'Name is null'
          ELSE 
               'Yes'
          END as IsTopAccount
 FROM Test.dbo.Accounts ACC
 LEFT JOIN Test.dbo.TopAccounts A ON A.Area = ACC.Area
 LEFT JOIN Test.dbo.TopAccounts N ON N.Name = ACC.Name
于 2013-02-21T17:50:36.290 に答える
2

私があなたの質問を理解していれば、両方のテーブルからFULL OUTER JOIN一致しないレコードを与えるシングルでも結果が得られると思います. フィドルデモnull

SELECT A.Name ,A.Area
      ,CASE
          WHEN TA.Area IS NULL AND TA.Name IS NULL
               THEN 'Name and Area do not match'
          WHEN A.Area IS NULL 
               THEN 'Area does not match'
          WHEN TA.Name IS NULL
               THEN 'Name is null'
          ELSE 
               'Yes'
          END as IsTopAccount
 FROM A  FULL OUTER JOIN  TA 
      ON TA.Area = A.Area AND TA.Name = A.Name

必要に応じて、両方のテーブルから null をチェックするように CASE を変更できます。join に関するいくつかの良い視覚的な例を次に示します

コメントによると、単一のFiddle-Demoで同じ結果が得られますLEFT JOIN

SELECT DISTINCT A.Name ,A.Area,
          CASE WHEN TA.Area IS NULL AND TA.Name IS NULL
               THEN 'Name and Area do not match'
          WHEN TA.Area <> A.Area 
               THEN 'Area does not match'
          WHEN TA.Name <> A.Name
               THEN 'Name is does not match'
          ELSE 'Yes' END IsTopAccount
FROM A LEFT JOIN  TA 
      ON A.Area = TA.Area OR A.Name = TA.Name
ORDER BY A.Name
于 2013-02-21T17:54:32.440 に答える