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在区域和名称上都加入到表中。我需要这两个连接来测试 case 语句中的每个条件。

是否可以更有效地测试 case 语句中的每个条件,也许用一个LEFT JOIN而不是两个单独LEFT JOIN的?

看到这个sql fiddle

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

你也许可以用两个来做到这一点:

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

您可以根据需要更改 CASE 以从两个表中检查 null。以下是关于连接的一些很好的视觉示例

根据评论,单个LEFT JOIN Fiddle-Demo的结果相同

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 回答