La conexión de Varias Tablas en SQL Limitando Exponencial Resultados
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.
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