2008-10-31 2 views
0

두 테이블 TAB_A 및 TAB_B가 있습니다. TAB_A는 마스터 테이블이고 TAB_B는 하위/트랜잭션 테이블입니다. TAB_A에는 COL_A (기본 키)가 있고 TAB_B에는 COL_B (기본 키)와 COL_A가 있습니다.DB2 쿼리 출력 - 다른 동작

비즈니스 이유에 따라 COL_A 열의 TAB_A와 TAB_B 사이에 외래 키가 정의되어 있지 않습니다.

TAB_A의 COL_A에서 일치하는 값이없는 COL_A의 값이 1, 2, 3 및 4 인 TAB_B의 레코드가 4 개 있습니다. 나는 다음과 같은 SELECT 쿼리를 실행하면, 나는 내가 SELECT 쿼리에서 A.COL_A를 참조 시작하면 네 개의 레코드가

SELECT B.COL_B, 
     B.COL_A 
    FROM TAB_A A, 
     TAB_B B 
WHERE A.COL_A = B.COL_A 
    AND B.COL_A IN (1, 2, 3, 4) 

그러나, 레코드가 반환되지 않습니다 얻을

(그들은 실수에 의해 만들어진 고아 기록이다) .

SELECT B.COL_B, 
     B.COL_A, 
     A.COL_A 
    FROM TAB_A A, 
     TAB_B B 
WHERE A.COL_A = B.COL_A 
    AND B.COL_A IN (1, 2, 3, 4) 

누군가 이상한 행동을 설명해 주실 수 있습니까? AIX

에서

DB2 버전 9.5을

+0

첫 번째 쿼리가 정확히 설명 된 것과 실제로 4 개의 레코드를 반환하는지 확인하십시오.COL_A의 값 1,2,3,4가 TAB_B에 없으면 아무 것도 반환하지 않습니다. –

+0

분명히 두 번째 검색어에 오타가 있습니다. A.COL_A = B.COL_C 또는 다른 일부 오타가 있다고 할 수 있습니다. – Hogan

답변

0

당신은 내부 조인 당신의 WHERE 절 대신 ON 절을 사용해야합니다. ON 절은 실제 조인과 관련이 있지만 WHERE는 일반적으로 조인과 관련이없는 추가 조건에 사용됩니다. IBM says : "결합 조건은 ON 키워드 뒤에 지정되며 결합 결과를 생성하기 위해 두 테이블을 서로 비교하는 방법을 결정합니다. [...] 실제와 관련이없는 추가 조건 조인은 WHERE 절 또는 ON 절의 실제 조인의 일부로 지정됩니다. "

예제에서 WHERE 절에서 조인 조건을 갖는 것과는 정반대로 수행하는 것처럼 보입니다. AFAIK, 이것은 불법은 아니지만 테이블 중 하나의 열만 참조하는 SELECT 절과 함께 사용하면이 이상한 동작을 설명 할 수 있습니다.

0

IBM 사이트의 문서를 검토했습니다. 그들은 "JOIN"을 사용하는 것에 대해 이야기하지만, "WHERE"조건 (내가 사용한)을 사용하여 직접 결합을 사용하는 것에 대한 언급이 있으며, 동일한 결과를 만들어야한다고 언급했습니다.

또한 이전에 Oracle 및 SQL Server에서 작업했습니다. 위의 구문은 정상적으로 작동했습니다. 여전히 SELECT 문에 추가 된 열이 있기 때문에 출력이 다른 이유는 확실하지 않습니다.

+0

오타가 있으며 질문에 추가 할 수있는 적절한 장소가 아닙니다.이 콘텐츠는 질문의 일부가되어야한다. – Hogan

1

두 쿼리가 모두 같은 행을 반환해야합니다. 설명대로 이것이 실제로 작동하면 DB2에서 버그를 발견하게됩니다.

이 쿼리로 무엇을하려합니까? B.COL_A의 값 (1,2,3,4)이 고아 레코드 인 경우이 쿼리는 행을 반환하지 않아야합니다. 고아를 찾고자한다면, 아마도 일종의 외부 조인을해야 할 것입니다.

0

두 번째 SQL은 사실상 "INNER JOIN"입니다.

표 B 행 1,2,3,4는 고아이므로 A.COL_A = B.COL_A 조건은 절대로 적용되지 않습니다.

행을 되돌리려면 명시 적으로 "LEFT OUTER JOIN"을 코딩해야하지만 A.COL_A는 항상 NULL을 반환합니다.

+0

첫 번째 쿼리는 'INNER JOIN'이 아니기 때문에 ....? "TAB_A"컬럼이'SELECT'리스트에 언급되지 않았기 때문에 이것을 보았습니다. "아마도 LEFT JOIN이라고 평가했을 것입니다. 그러나 이것은 행동의 이상한 선택입니다. 어떤 경우에 (또는 이와 비슷한) 진술서를 찾았습니까? 그렇지 않으면 나는 완전히 다른 일이 벌어 질 것으로 기대한다. –