Pregunta

He buscado en Google y Desbordamiento de Pila para una respuesta a mi consulta, pero siento que mi falta de SQL vocabulario está de pie en mi camino para encontrar una respuesta ya que creo que esta sería una pregunta común.Cualquier útil apunta en la dirección de lo que necesito para estar leyendo siempre son bienvenidos.

A la pregunta, estoy tratando de unir tres tablas en Oracle 8i, por ejemplo, una Empresa de Tabla, una Tabla de Factura y una Tabla de Trabajos que no existe ningún vínculo entre la Factura de la Tabla y la Tabla de tareas.Tengo la esperanza de que en una consulta puedo unir las tres tablas de devolver todas las facturas y todos los puestos de trabajo de una empresa, sin devolver todos los puestos de trabajo para cada una de las facturas (ver mis resultados del ejemplo a continuación).

Quiero ver:

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

No quiero 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 siempre gracias por cualquier ayuda que puede ofrecer.

EDITAR:

En esencia tanto de la Factura y de Trabajo de las Mesas ambos tienen una Tabla de la Empresa campo de Clave es que el Trabajo y la Factura de la tabla no tienen ninguna relación entre sí directamente.Si la instancia surge cuando hay 2 Facturas y 3 Puestos de trabajo me gustaría idealmente como para mostrar y viceversa:

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

Aunque mirando el problema como este me hace sentir que esto está más lejos de una respuesta más sencilla de lo que yo esperaba.

¿Fue útil?

Solución

Su requisito significa que usted tiene un problema con su esquema.Mi primer consejo en este caso sería modificar su esquema:añadir un job_id a invoice o un invoice_id a job (o un N-N relación de la tabla invoice_job).

Si usted no está dispuesto a actualizar el esquema, se puede trabajar de una consulta que se va a hacer la combinación.El consulta siguiente básicamente unirse job y invoice uno a uno:

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

La condición de combinación, aquí es artificial.Si usted eliminar una factura, los puestos de trabajo y facturas de la relación puede cambiar.

Si las dos tablas están muy relacionados, puede que desee en lugar de mostrar los resultados de manera diferente, por ejemplo:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top