Pergunta

Eu procurei no Google e Estouro de Pilha para uma resposta para a minha pergunta, mas eu sinto a minha falta de SQL vocabulário está de pé na minha maneira de encontrar uma resposta como eu acredito que essa seria uma pergunta comum.Qualquer útil aponta na direção de que eu preciso para ser de leitura são sempre bem-vindos.

Sobre a pergunta, eu estou tentando juntar três tabelas no Oracle 8i, por exemplo, uma Empresa, uma Tabela, uma Fatura Tabela e uma Tabela de Tarefas não existe nenhuma ligação entre a Fatura Tabela e a Tabela de Tarefas.Eu estou esperando que em uma consulta que eu possa vincular todas as três tabelas de retornar todas as faturas e todos os trabalhos para uma empresa sem retornar todos os trabalhos para cada nota fiscal (ver os meus resultados do exemplo abaixo).

Eu quero ver:

Company 1   Invoice 1   Job 1
Company 1   Invoice 2   Job 2
Company 1   Invoice 3   Job 3

Eu não quero ver:

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

Como sempre, obrigado por qualquer ajuda que você pode oferecer.

EDITAR:

Essencialmente, tanto a Fatura de Trabalho e Tabelas de ambos tem uma Empresa de Mesa campo de Chave é que o Trabalho e a Fatura tabela sem nenhuma ligação entre si diretamente.Se o exemplo vem de cima, quando há 2 Faturas e 3 postos de trabalho que eu gostaria de mostrar e vice-versa:

Company 1   Invoice 1   Job 1
Company 1   Invoice 2   Job 2
Company 1               Job 3

Apesar de olhar para o problema como isso me faz sentir que isso está mais longe de mais fácil resposta que eu esperava.

Foi útil?

Solução

Sua exigência significa que você tem um problema com seu esquema.Meu primeiro conselho, neste caso, seria para modificar seu esquema:adicionar um job_id para invoice ou um invoice_id para job (ou um N-N tabela de relação invoice_job).

Se você não está disposto a atualização de seu esquema, você pode trabalhar uma consulta que irá fazer a associação.O consulta seguinte será, basicamente, junte-se job e invoice um-para-um:

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

A condição de associação aqui é artificial.Se você remover uma factura, os trabalhos e facturas relação pode mudar.

Se as duas tabelas são realmente independentes, você pode querer em vez de apresentar os resultados de forma diferente, por exemplo:

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top