기본 키를 구성하는 PO_BreakOutAll
두 개의 열 ( PO_ID
, PO_LN_NO
) 로만 구성된 ~ 3000 행이있는 마스터 테이블 ( ) 이 하나 있습니다. 또한 마스터 테이블의 데이터 하위 집합이있는 여러 개의 다른 테이블도 있습니다 (또는 그럴 것으로 예상 됨). 모든 테이블은 마스터 테이블과 동일한 스키마입니다.
모든 테이블에는 다음과 같은 정확한 스키마가 있습니다.
PO_ID char(5) PK
PO_LN_NO int PK
유효성 검사와 중복을 찾으려면 두 가지 유형의 비교를 수행해야합니다.
먼저 마스터 테이블의 모든 행이 다른 하위 테이블 중 하나에 만 존재하는지 확인합니다.
두 번째로 하위 테이블에서 행이 중복되지 않도록해야합니다. 동일한 행이 둘 이상의 자식 테이블에 존재할 수 있으며이를 찾아야합니다.
각 테이블을 별도의 쿼리로 수행 할 수 있지만 모든 하위 테이블을 한 번에 비교하는 하나의 쿼리를 작성하는 방법을 찾지 못했습니다.
지금까지 가지고 있지만 작동하지 않습니다.
SELECT a.PO_ID as all_PO,
a.PO_LN_NO,
c.PO_ID as Cummings_PO,
c.PO_LN_NO,
f.PO_ID as filter_PO,
f.PO_LN_NO,
fo.PO_ID as fixedObl_PO,
fo.PO_LN_NO
FROM
PO_BreakOutAll a
LEFT OUTER JOIN
PO_Cummins c ON (c.PO_ID = a.PO_ID AND c.PO_LN_NO = a.PO_LN_NO)
LEFT OUTER JOIN
PO_Filters f ON (f.PO_ID = a.PO_ID AND f.PO_LN_NO = a.PO_LN_NO)
LEFT OUTER JOIN
PO_FixedOblig fo ON (fo.PO_ID = a.PO_ID AND fo.PO_LN_NO = a.PO_LN_NO)
@gordon linoff가 전반적인 해결책을 가지고 있다고 생각합니다. CTE 패러다임을 사용하려는 경우 여기 에 중복 질문에 답하는 Fiddle 을 기반으로 한 예제가 있습니다 .
WITH CTE (PO_ID,PO_LN_NO,TableName) AS
(SELECT
PO_ID,
PO_LN_NO,
'Cummings' as TableName
FROM PO_Cummins
UNION ALL
SELECT
PO_ID,
PO_LN_NO,
'Filters' as TableName
FROM PO_Filters
UNION ALL
SELECT
PO_ID,
PO_LN_NO,
'Office' as TableName
FROM PO_Office )
SELECT
PO_BreakOutAll.PO_ID,
PO_BreakOutAll.PO_LN_NO,
CHILD_DATA.TABLENAME AS DUP_TABLENAME
FROM
PO_BreakOutAll
INNER JOIN (
SELECT PO_ID, PO_LN_NO, COUNT(1) AS DUP_COUNTER
FROM CTE
GROUP BY PO_ID, PO_LN_NO
HAVING COUNT(1) > 1
) DUPS ON DUPS.PO_ID = PO_BreakOutAll.PO_ID AND DUPS.PO_LN_NO = PO_BreakOutAll.PO_LN_NO
INNER JOIN (
SELECT PO_ID, PO_LN_NO, TABLENAME
FROM CTE
) CHILD_DATA
ON CHILD_DATA.PO_ID = PO_BreakOutAll.PO_ID AND CHILD_DATA.PO_LN_NO = PO_BreakOutAll.PO_LN_NO
ORDER BY PO_ID, PO_LN_NO, DUP_TABLENAME
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다