Question

J'ai cherché sur Google et Stack Overflow une réponse à ma requête, mais je pense que mon manque de vocabulaire SQL m'empêche de trouver une réponse car je pense que ce serait une question courante.Tous les points utiles dans le sens de ce que je dois lire sont toujours les bienvenus.

Concernant la question, j'essaie de joindre trois tables dans Oracle 8i, par exemple une table d'entreprise, une table de factures et une table de travaux. Il n'y a aucun lien entre la table de factures et la table de travaux.J'espère qu'en une seule requête, je pourrai lier les trois tables renvoyant toutes les factures et tous les travaux d'une entreprise sans renvoyer tous les travaux pour chaque facture (voir mes exemples de résultats ci-dessous).

Je veux voir:

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

Je ne veux pas voir :

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

Comme toujours, merci pour toute aide que vous pouvez offrir.

MODIFIER:

Essentiellement, les tables de facture et de travail ont toutes deux un champ Clé de table d'entreprise, c'est juste que les tables de travail et de facture n'ont aucun lien direct entre elles.Si le cas se présente lorsqu'il y a 2 factures et 3 tâches, j'aimerais idéalement qu'il s'affiche et vice versa :

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

Bien que regarder le problème comme celui-ci me donne l’impression que c’est plus loin d’une réponse plus facile que je ne l’espérais.

Était-ce utile?

La solution

Votre exigence signifie que vous avez un problème avec votre schéma.Mon premier conseil dans ce cas serait de modifier votre schéma :ajouter un job_id à invoice ou un invoice_id à job (ou une table de relations N-N invoice_job).

Si vous ne souhaitez pas mettre à jour votre schéma, vous pouvez exécuter une requête qui effectuera la jointure.Le requête suivante rejoindra essentiellement job et invoice Un par un:

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 condition de jointure ici est artificielle.Si vous supprimez une facture, la relation entre les tâches et les factures peut changer.

Si les deux tableaux ne sont vraiment pas liés, vous souhaiterez peut-être afficher les résultats différemment, Par exemple:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top