DB2SQL连接时比较

DB2SQL连接时比较,sql,database,join,db2,compare,Sql,Database,Join,Db2,Compare,我有以下数据: 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(tblOneIn

我有以下数据:

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进行分组和排序。我没有主意了

预期输出:如果从表1中选择,则匹配前两个整数,如果匹配,则比较地址。如果匹配,则不显示。如果不匹配,则显示不匹配的地址。反之亦然,如果从表2中选择,则匹配前两个整数。如果匹配,则在地址上进行比较,如果不匹配,则显示为空无数据

任何帮助都将不胜感激

多谢各位

此查询:

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;

然后还可以将不等式条件移动到何处。但是,使用左连接,然后将不等式移动到何处是相当荒谬的-为什么要指定外部连接,然后在WHERE子句中撤消它?

此问题的解决方案如下:

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子句compare消除

这是提供商数据的实际生产问题。一旦发现了解决方案,它看起来非常简单,但找到解决方案总是一个棘手的部分,对吗?我希望这对其他人有帮助

2016年4月24日编辑

经过更多的质量测试后,该解决方案需要附加条款,即:

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子句中。我希望这对其他人有帮助

试试这个:

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;

你期望的结果是什么?好问题。我已将预期输出添加到问题中。谢谢你,乌萨夫。嗨,戈登,我尝试了两种可能性,结果都一样。请参阅更新的预期输出。
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;
--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