|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre Expert
![]() Consultant J2EE Inscription : octobre 2007 Messages : 889 ![]() |
Bonjour a tous, petit nouveau ici mais je compte bien m'installer
Je suis actuellement en stage et fais du J2EE (Swing) (bon ok on s'en fou un peu c'est pas le sujet) et j'ai un probleme de doublons lors d'une requete avec Union sur une db oracle. Je m'explique: je travaille sur une base de donnée qui est en sorte dédoublée: cad qu'en gros il y a sur le meme serveur oracle 2 bases identiques (les tables ont des prefixes exemple B1_TABLE et B2_TABLE contiennent les champs (meme type etc), mais pas les memes données !!! En gros je suis amené a rechercher des informations dans ces deux tables en meme temps, en gros faire la meme requete sur les 2 tables, puis faire une union... seulement comme je le précise, les données ne sont pas exactement les memes ce qui fait que lors de mon union je me retrouve avec des resultats du genre: CLEPRIMAIRE DATA ------------ ----- 123 D1 (ligne issue de la B1) 123 D2 (ligne issue de la B2) Seulement il faudrait que je puisse récupérer uniquement la ligne de la B1 si jamais elle existe, et sinon récupérer celle de la D2 (en fait plus exactement, selon la valeur d'un champ statut dans la B2, je dois récupérer l'une ou l'autre des 2 lignes) Bref je voulais savoir s'il n'existait pas une solution relativement simple et optimisée pour ce genre de cas qui permettrait d'éliminer les doublons selon des champs spécifiés (clé primaire ici par exemple) plutot que sur l'ensemble des résultats... Sachant que ma requete de base est deja assez lourde il me faut vraiment quelque chose d'optimisé (je récupere une 50aine de champs sur une base avec plusieurs centaines de milliers de lignes, alors je suppose que tout traitement en java sur les objets récupérés est a excluse ^^) Je ne suis pas un pro du sql, désolé si ma question vous semble idiote |
|
|
00
|
|
|
#2 | ||
|
Membre actif
![]() Inscription : août 2007 Messages : 176 ![]() |
Tu peux faire :
Code :
|
||
|
|
00
|
|
|
#3 | ||
|
Membre actif
![]() Inscription : août 2007 Messages : 176 ![]() |
Ou alors avec des FULL OUTER JOIN(mais il faut tester au niveau des performances)
Code :
|
||
|
|
00
|
|
|
#4 | |||
|
Membre Expert
![]() Consultant J2EE Inscription : octobre 2007 Messages : 889 ![]() |
Citation:
Waahouuh je suis impressionné niveau performance, car un collegue a fait un truc qui ressemblait un peu sur une autre requete et ca prends pratiquement 30 secondes la requete!!! un ptit bout de code java de ma dao: String sqlQuery = FROM_BDU + "WHERE phy.cprn = adr.cprn " + "AND adr.cprn = prn.cprn " + "AND phy.cprn NOT IN (SELECT cprn FROM irccttr) " + "AND UPPER(phy.lnompatprn) LIKE '%" + LastName.toUpperCase() + "%' " + "AND UPPER(phy.lpreprn) LIKE '%" + FirstName.toUpperCase() + "%' " + "ORDER BY phy.lnompatprn "; Lui c'etait avec NOT IN, et pas exists, comment ca se fait que sa requete soit aussi longue par rapport a celle que tu m'as donné ? C'est quoi globalement la difference je comprends pas trop ^^ En tout cas merci ca fait ce que je voulais |
|||
|
|
00
|
|
|
#5 |
|
Membre actif
![]() Inscription : août 2007 Messages : 176 ![]() |
NOT IN est moins performant que le NOT EXISTS, une recherche sur google te donnera certainement plus de précision là dessus, mais en gros, le NOT IN empêche l'utilisation d'index si celui-ci existe. Dans ton cas, si tu as un index sur le champ KEY de ta table 2, celui-ci n'est pas utilisé avec un NOT IN,mais le NOT EXISTS le prend en compte
Est-ce que tu as essayé avec le FULL OUTER JOIN ? Suivant ton SI, cela pourrait être encore plus rapide ? |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Consultant J2EE Inscription : octobre 2007 Messages : 889 ![]() |
J'ai envi de dire la flemme de tester, 0.2sec contre 30sec ca me convient
merci bien hihi |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com