2017-04-09 3 views
0

나는 다음과 같은 데이터가 있습니다DB2의 SQL은에 가입 비교

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에서 해결 기대.

위의 SQL과 비교할 때 나는 여전히 12345 E AVE STREET 데이터 결과를 얻습니다. 나는 또한 하위 쿼리에 합류하려고 시도했다. 또한 그룹화를 시도하고 오름차순으로 정렬했다. 나는 아이디어가 없다.

예상 출력 : TABLE1에서 선택하는 경우 처음 두 정수가 일치하면 일치하고 그 다음 주소가 비교됩니다. 일치하는 경우 표시하지 않습니다. 일치하지 않으면 일치하지 않는 주소를 표시합니다. 그 반대의 경우, TABLE2에서 선택하면 처음 두 정수가 일치합니다. 일치하는 경우 주소에서 비교하고 일치하지 않으면 표시가 null (데이터 없음)이어야합니다.

도움을 주시면 감사하겠습니다.

감사합니다.

+0

당신의 예상 출력 – Utsav

+0

좋은 질문은 무엇인가. 내 문제에 예상되는 출력을 추가했습니다. Utsav 감사합니다. –

답변

0

이 문제에 대한 해결책은 다음이었다

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 절 비교에 의해 제거됩니다.

이것은 공급자 데이터의 실제 생산 문제였습니다. 솔루션이 발견되면 매우 간단 해 보입니다.하지만 솔루션에 도달하는 것은 항상 까다로운 부분입니다. 맞습니까? 나는 이것이 다른 누군가를 돕기를 바랍니다. (가) 'WHERE NOT IN'하위 쿼리를 할 수 있습니다 물론

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 

: 편집 2016년 4월 24일

더 품질 테스트 후,이 솔루션이었다 부칙을 필요 발견 된 것을 제외합니다. 이것은 NOT IN 절에서 제외 된 CTE를 사용하여 수행 할 수도 있습니다. 나는 이것이 다른 누군가를 돕기를 바랍니다.

0

이 쿼리는 :

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입니다. 그것이 무엇을 해야하는지입니다.

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에 불평등 상태를 이동할 수 있습니다 : 첫 번째 테이블에서 행을 필터링하려면

는 다음 JOIN 유형을 변경합니다. 하지만 LEFT JOIN을 사용하고 부등호를 WHERE으로 옮기는 것은 어리석은 행위입니다. 왜 바깥 쪽 조인을 지정한 다음 WHERE 절에서 실행 취소할까요?

+0

안녕하세요, 고든, 저는 같은 결과를 가지고 두 가지 가능성을 모두 시험해 보았습니다. 업데이트 된 "예상 출력"을 참조하십시오. –

0

이 시도 :

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; 
0
--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