문제

나는 검색이 구글과 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 하기 invoiceinvoice_id 하기 job (or N-N 관계 테이블 invoice_job).

는 경우 당신이 기꺼이 업데이트를 당신의 스키마에,당신은 작동할 수 있는 쿼리를 만들 것입니다.이 다음과 같은 쿼리 기본적으로 참가 jobinvoice 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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top