Optimisation d'une jointure entre 3 tables - SQL/NoSQL - Programmation
Marsh Posté le 13-12-2005 à 10:28:41
select distinct ID, LIBELLE from
(
select ID, LIBELLE from A
union
select ID, LIBELLE from B
union
select ID, LIBELLE from C
)
devient :
select ID, LIBELLE from A
union all
select ID, LIBELLE from B
union all
select ID, LIBELLE from C
Je vois pas ce que tu peux faire de plus
Marsh Posté le 13-12-2005 à 12:23:21
Non, c'est plutôt :
select distinct ID, LIBELLE from
(
select ID, LIBELLE from A
union
select ID, LIBELLE from B
union
select ID, LIBELLE from C
)
devient
select ID, LIBELLE from A
union
select ID, LIBELLE from B
union
select ID, LIBELLE from C
car l'opérateur UNION fait déjà le DISTINCT en interne ...
Marsh Posté le 13-12-2005 à 12:39:29
ben non, justement, il faut mettre "all" pour ne pas avoir de distinct, puisque les codes sont exclusives (un même ID ne peut pas être dans deux tables à la fois d'après la question du début).
hors, ce qui prends du temps dans un UNION, c'est bien ce distinct... Sans lui, le UNION est infiniment plus rapide.
Marsh Posté le 13-12-2005 à 12:40:42
euh... j'ai dit une connerie.
c'est quoi l'erp en question que je ne travaille JAMAIS avec ?
ps: du coup c'est beegee qui a raison, et t'as plus qu'à rammer !
Marsh Posté le 13-12-2005 à 13:48:43
loool justement si des meme id peuvent se retrouver dans 2 tables!!!
effectivement c'est l'opération du disctinct qui est lente.
Je me retrouve avec des trucs du genre
Id 1 lib 1
Id 1 lib 2
Id 2 lib 3
Id 3 lib 4
... etc
car pour un même ID je peux avoir des lib différents !!
L'ERP en question est BAAN... une horreur au vu du nombre de tables gérées!
Marsh Posté le 13-12-2005 à 14:10:47
j'en ai bien l'impression !
moi je garde GénériX. Le modèle un un peu pourrave, mais il a quand même le 3° niveau de certification MERISE, ce qui implique un truc un minimum pas trop boîteux... là BAAN il semble ne même pas passer le premier niveau ! (c'est gradiose de spliter une table en 3... avec des données redondantes en plus !)
Marsh Posté le 13-12-2005 à 14:12:06
Sinon, si t'as ça :
Id 1 lib 1
Id 1 lib 2
Id 2 lib 3
Id 3 lib 4
Est-ce que le "distinct" est réellement utile ? Vérifie que t'as pas systématiquement des valeurs différentes quand elles sont en doublon. Parce que dans ce cas, fout des UNION ALL, ça ira bien plus vite.
Marsh Posté le 13-12-2005 à 14:15:51
c'est ce que j'ai fini par faire.
j'ai mis union all, et je refais un select par dessus afin d'avoir uniquement, de façon arbitraire, le MAX des libelles:
select idArt as ARTICLE, MAX(des) as DESIGN_ARTICLE
from
(
select art.T$ITEM idArt, art.T$DSCA as des from art
union all
select art_test.T$EITM as idArt, art_test.T$DSCA as des from art_test
union all
select projet.T$ITEM as idArt, projet.T$DSCA as des from projet
)
group by idArt
Merci a toi en tous cas!
Marsh Posté le 13-12-2005 à 10:22:09
Bonjour à tous,
J'ai besoin de conseil d'expert concernant une jointure entre 3 tables.
Voici mon probleme: j'ai trois tables A, B et C qui représentent des articles. Elles font partie d'un ERP, je n'ai pas la main dessus
Dans chacune des table, 2 champs commun: ID et LIBELLE
Une quatrième table, Fiche, comporte une clé externe ID_PRODUIT représentant un identifiant produit pouvant être dans A, B ou C....
Les elements de A B et C sont non disjoints IE je peux avoir comme id dans A: 1, 2
dans B: 2, 3 et dans C: 3, 4
je cherche a faire une requete la plus optimisée possible -car ces tables sont volumineuses...- permettant de remonter de façon unique tous les produits (id et libelle): D : 1, 2, 3, 4
La façon triviale de faire:
select distinct ID, LIBELLE from
(
select ID, LIBELLE from A
union
select ID, LIBELLE from B
union
select ID, LIBELLE from C
)
Merci à tous!!!
PS: SGBD Oracle 8i