을 연결하는 여러 테이블에서 SQL 제한하면서 지수 결과
문제
나는 검색이 구글과 Stack Overflow 에 대한 답변을 쿼리,하지만 나는 느낌이 나의 부족 SQL 어휘의 길에 서의 해답을 찾는 내가 이것을 믿는 것이 일반적인 질문입니다.모든 도움이의 방향으로 내가 무엇을 읽은 언제나 환영합니다.
질문에,나는 가입하려는 세 가지 테이블에서 Oracle8i,예를 들어,회사 테이블,송장 테이블 및 작업 테이블 사이에 연결이 없는 송장 테이블 및 작업이다.나를 바라고 하나에서 쿼리를 할 수 있습니다 모든 세 가지 테이블 반환 모든 청구서와 모든 작업은 회사에 반환하지 않고 모든 작업에 대한 각 청구서(내 결과 예 아래).
보고 싶:
Company 1 Invoice 1 Job 1
Company 1 Invoice 2 Job 2
Company 1 Invoice 3 Job 3
나는 원하지 않을 참조하십시오:
Company 1 Invoice 1 Job 1
Company 1 Invoice 1 Job 2
Company 1 Invoice 1 Job 3
Company 1 Invoice 2 Job 1
Company 1 Invoice 2 Job 2
Company 1 Invoice 2 Job 3
Company 1 Invoice 3 Job 1
Company 1 Invoice 3 Job 2
Company 1 Invoice 3 Job 3
으로 항상 감사에 대한 어떤 도움을 제공할 수 있습니다.
편집:
기본적으로 모두 송장 및 작업 테이블을 모두 회사 테이블의 키 필드 그것은 단지는 직업 및 송장 테이블이 없음에 대한 링크를 서로 직접 있습니다.는 경우 인스턴스가 있는 2 송장 및 3 일 나는 이것을 보고 그 반대의 경우도 마찬가지:
Company 1 Invoice 1 Job 1
Company 1 Invoice 2 Job 2
Company 1 Job 3
에서 찾고 있지만 문제는 다음과 같이 느끼게 만드는 것이 더 멀리에서 쉽게 대답이 나보다 희망했다.
해결책
귀하의 요구 사항을 의미가 있는 것에 문제가 당신의 스키마.나의 첫번째 조언을 이 경우에는 것을 수정 당신의 스키마:추가 job_id
하기 invoice
나 invoice_id
하기 job
(or N-N 관계 테이블 invoice_job
).
는 경우 당신이 기꺼이 업데이트를 당신의 스키마에,당신은 작동할 수 있는 쿼리를 만들 것입니다.이 다음과 같은 쿼리 기본적으로 참가 job
고 invoice
one-to-one:
SELECT c.company_id, ij.job_id, ij.invoice_id
FROM company c
LEFT JOIN (SELECT job_id, invoice_id,
NVL(j.company_id, i.company_id) company_id
FROM (SELECT j.job_id, j.company_id,
row_number() OVER (PARTITION BY company_id
ORDER BY job_id) job_no
FROM job j) j
FULL OUTER JOIN
(SELECT i.invoice_id, i.company_id,
row_number() OVER (PARTITION BY company_id
ORDER BY invoice_id) invoice_no
FROM invoice i) i
ON j.company_id = i.company_id
AND j.job_no = i.invoice_no) ij
ON c.company_id = ij.company_id
가입 조건이 여기에 인공 있습니다.을 제거하는 경우,청구서 작업 및 송장의 관계를 변경될 수 있습니다.
면 테이블이 정말 무관할 수 있습니다 대신 결과를 표시하는 다르게, 예를 들어:
SQL> SELECT cj.company_id, cj.jobs,
2 listagg(i.invoice_id, ',')
3 WITHIN GROUP (ORDER BY i.invoice_id) invoices
4 FROM (SELECT c.company_id,
5 listagg(j.job_id, ',') WITHIN GROUP (ORDER BY job_id) jobs
6 FROM company c LEFT JOIN job j ON c.company_id = j.company_id
7 GROUP BY c.company_id) cj
8 LEFT JOIN invoice i ON cj.company_id = i.company_id
9 GROUP BY cj.company_id, cj.jobs;
COMPANY_ID JOBS INVOICES
----------- ------ --------
1 1,2,3 1,2