【问题标题】:DB2 SQL Compare on JOINJOIN 上的 DB2 SQL 比较
【发布时间】:2017-04-09 05:42:43
【问题描述】:

我有以下数据:

TABLE1: 
ADDRESS               INTER1    INTER2
12345 E AVE STREET    44444     55555555
888 OtherStreet       44444     55555555


TABLE2: 
ADDRESS             INTER1  INTER2
12345 E AVE STREET  44444   55555555

我大概可以这样在代码中解决:

if(tblOneInterOne == tblTwoInterOne ) {
   // compare address                                   
}

,但希望在 SQL 中解决。

SELECT 
     A.ADDRESS
   , A.INTER1
   , A.INTER2
FROM TABLE1 AS A
    LEFT JOIN TABLE2 AS B
    ON A.INTER1 = B.INTER1
    AND A.INTER2 = B.INTER2
    AND A.ADDRESS <> B.ADDRESS

当与上面的 SQL 比较时,我的数据结果仍然得到这个地址:12345 E AVE STREET。我也尝试过加入子查询,我也尝试过分组和按 asc 排序。我没主意了。

预期输出:如果从 TABLE1 中选择,则匹配前两个整数,如果匹配,则比较地址。如果匹配,则不显示。如果不匹配,则显示不匹配的地址。反之亦然,如果从 TABLE2 中选择,则匹配前两个整数。如果匹配,则比较地址,如果不匹配,则显示应为空(无数据)。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

  • 你的预期输出是什么
  • 好问题。我已将预期的输出添加到我的问题中。谢谢你Utsav。

标签: sql database join db2 compare


【解决方案1】:

这个查询:

SELECT A.ADDRESS, A.INTER1, A.INTER2
FROM TABLE1 A LEFT JOIN
     TABLE2 B
     ON A.INTER1 = B.INTER1 AND
        A.INTER2 = B.INTER2 AND
        A.ADDRESS <> B.ADDRESS;

将返回A 中的所有行。这就是LEFT JOIN 所做的。这就是它应该做的。

如果要过滤第一个表中的行,请更改JOIN 类型:

SELECT A.ADDRESS, A.INTER1, A.INTER2
FROM TABLE1 A INNER JOIN
     TABLE2 B
     ON A.INTER1 = B.INTER1 AND
        A.INTER2 = B.INTER2 AND
        A.ADDRESS <> B.ADDRESS;

您还可以将不等式条件移至WHERE。但是使用LEFT JOIN 然后将不等式移动到WHERE 是相当荒谬的——为什么要指定一个外连接然后在WHERE 子句中撤消它?

【讨论】:

  • 嗨,戈登,我已经尝试了两种可能性,结果相同。请查看更新后的“预期输出”。
【解决方案2】:

试试这个:

SELECT 
        ifnull(f1.INTER1, f2.INTER1) as INTER1, 
        ifnull(f1.INTER2, f2.INTER2) as INTER2, 
        f1.ADDRESS as ADDRESS_A, f2.ADDRESS as ADDRESS_B,
        case 
        when f1.INTER1 then 'ADDRESS NOT IN TABLE1'
        when f2.INTER1 then 'ADDRESS NOT IN TABLE2'
        else 'ADDRESS ARE DIFFERENT' end as DIAGNOSTIC
FROM TABLE1 f1 
FULL OUTER JOIN TABLE2 f2 ON (f1.INTER1, f1.INTER2)  = (f2.INTER1, f2.INTER2)
where 
        f1.INTER1 is null or 
        f2.INTER1 is null or 
        f1.ADDRESS <> f2.ADDRESS;

【讨论】:

    【解决方案3】:
    --other solution if you want your result into multiple rows
    
    select * from 
    (
    select ADDRESS, INTER1, INTER2 from table1
    except
    select ADDRESS, INTER1, INTER2 from table2
    ) tmp1
    
    union all 
    
    select * from 
    (
    select ADDRESS, INTER1, INTER2 from table2
    except
    select ADDRESS, INTER1, INTER2 from table1
    ) tmp2
    

    【讨论】:

      【解决方案4】:

      这个问题的解决方法如下:

      SELECT 
           A.ADDRESS
         , A.INTER1
         , A.INTER2
      FROM TABLE1 AS A
          INNER JOIN TABLE2 AS B
             ON A.INTER1 = B.INTER1
             AND A.INTER2 = B.INTER2
          LEFT JOIN TABLE2 AS B1
             ON B1.ADDRESS <> B.ADDRESS
      WHERE A.ADDRESS <> B.ADDRESS
      AND B1.ADDRESS IS NOT NULL
      

      这允许匹配前两个整数值,然后连接地址。但是,这会导致仍显示具有多个地址的记录。这被 WHERE 子句比较消除了。

      这是供应商数据的实际生产问题。一旦找到解决方案,看起来就非常简单——但找到解决方案总是很棘手的部分,对吧?我希望这对其他人有帮助。

      编辑 04/24/2016

      经过更多质量测试,此解决方案需要附加子句,即:

      SELECT 
           A.ADDRESS
         , A.INTER1
         , A.INTER2
      FROM TABLE1 AS A
          INNER JOIN TABLE2 AS B
             ON A.INTER1 = B.INTER1
             AND A.INTER2 = B.INTER2
          LEFT JOIN TABLE2 AS B1
             ON B1.ADDRESS <> B.ADDRESS
      WHERE NOT IN (SELECT B2.ADDRESS FROM TABLE2 AS B2 
                         INNER JOIN TABLE1 AS A2 
                           ON B2.INTER1 = A2.INTER1
                            AND B2.INTER2 = A2.INTER2)
      
       A.ADDRESS <> B.ADDRESS
      AND B1.ADDRESS IS NOT NULL
      

      当然,“WHERE NOT IN”允许子查询排除找到的任何内容。这也可以使用 CTE 然后在 NOT IN 子句中排除来完成。我希望这对其他人有帮助。

      【讨论】:

        猜你喜欢
        • 2013-10-05
        • 1970-01-01
        • 1970-01-01
        • 2020-09-08
        • 1970-01-01
        • 2012-05-14
        • 2017-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多