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