Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/07/2011, 14h13   #1
Invité de passage
 
Inscription : janvier 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 14
Points : 3
Points : 3
Par défaut Optimisation requête avec UNION

Bonjour,

Je dois faire une requête avec une clause where sur 2 champs. Le problème est que je dois faire 3 combinaisons sur ces 2 champs. Voici la première requête que j'ai essaye :
Code :
1
2
3
SELECT *
FROM matable
WHERE (champ1 = 'test1' AND champ2 = 3) OR (champ1 = 'test2' AND champ2 = 5) OR (champ1 = 'test3' AND champ2 = 1)
Cette requête n'a pas fonctionnée, je me suis donc tourné vers UNION, mais je ne suis pas satisfait de cette méthode :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT *
FROM matable
WHERE champ1 = 'test1' AND champ2 = 3
UNION
SELECT *
FROM matable
WHERE champ1 = 'test2' AND champ2 = 5
UNION
SELECT *
FROM matable
WHERE champ1 = 'test3' AND champ2 = 1
N'y a t-il pas une meilleure façon de faire ?
vaccary est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 15h19   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
bonjour,

que veux dire "n'a pas fonctionné" ?

Votre 1ere solution est sans doute la meilleur et doit fonctionner.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 15h39   #3
Invité de passage
 
Inscription : janvier 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 14
Points : 3
Points : 3
Lorsque j'ai essaye la première solution, aucun résultat n'a été retourné. Je vais réessayer, j'ai peut être commis une erreur !
vaccary est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2011, 15h47   #4
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
Citation:
Envoyé par vaccary Voir le message
Bonjour,

Je dois faire une requête avec une clause where sur 2 champs. Le problème est que je dois faire 3 combinaisons sur ces 2 champs. Voici la première requête que j'ai essaye :
Code :
1
2
3
SELECT *
FROM matable
WHERE (champ1 = 'test1' AND champ2 = 3) OR (champ1 = 'test2' AND champ2 = 5) OR (champ1 = 'test3' AND champ2 = 1)
Cette requête n'a pas fonctionnée, je me suis donc tourné vers UNION, mais je ne suis pas satisfait de cette méthode :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT *
FROM matable
WHERE champ1 = 'test1' AND champ2 = 3
UNION
SELECT *
FROM matable
WHERE champ1 = 'test2' AND champ2 = 5
UNION
SELECT *
FROM matable
WHERE champ1 = 'test3' AND champ2 = 1
N'y a t-il pas une meilleure façon de faire ?
Bonjour,

Executez les deux requêtes et postez ici les deux "explain plan" afin que l'on puisse mesurer la différence. Pourriez vous avant de lancer les deux requêtes en question faire ceci

Code :
1
2
3
 
ALTER session SET statistics_level=ALL;
SET linesize 150;
Afin d'obtenir ces "explain plans" je vous conseille de faire suivre la fin de votre requête par la commande sql suivante (qui extrait l'explain plan à partir de la mémoire)

Code :
1
2
 
SELECT * FROM TABLE(dbms_xplan.display_cursor(NULL,NULL,'ALLSTATS LAST'));
Bien respectueusement

Mohamed Houri
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/07/2011, 16h28   #5
Invité de passage
 
Inscription : janvier 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 14
Points : 3
Points : 3
Merci pour votre aide. Je sais désormais pourquoi ça ne fonctionnait pas, le serveur sur lequel est la BDD est en train de tomber en rade, notre administrateur BDD se bat avec depuis plusieurs heures !

Désole pour la gène occasionnée,
Vincent
vaccary est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 10h59   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Attention, UNION applique un DISTINCT, le résultat sera donc différent de la requête initiale. l'équivalent de OR et UNION ALL
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/07/2011, 12h26   #7
Invité de passage
 
Inscription : janvier 2010
Messages : 14
Détails du profil
Informations forums :
Inscription : janvier 2010
Messages : 14
Points : 3
Points : 3
Merci pour cette précision, toujours bon a savoir !
vaccary est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2011, 14h06   #8
Membre Expert
 
Inscription : août 2009
Messages : 779
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 779
Points : 1 098
Points : 1 098
Citation:
Envoyé par orafrance Voir le message
Attention, UNION applique un DISTINCT, le résultat sera donc différent de la requête initiale. l'équivalent de OR et UNION ALL
Je dirais justement que si les conditions dans le OR n'étaient pas exclusives, un UNION ALL dédoublerait des lignes présentes une seule fois dans une requête par OR.

Là de toute façon les conditions sont exclusives, on est donc sûr que chaque ligne ne peut être ramenée que par une des conditions, donc l'avantage du UNION ALL c'est la peformance (pourquoi s'assurer qu'il n'y a pas de doublons quand on sait qu'il ne peut pas y en avoir ?).
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h11.


 
 
 
 
Partenaires

Hébergement Web