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 19/02/2008, 16h32   #1
Membre régulier
 
Inscription : octobre 2005
Messages : 259
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : octobre 2005
Messages : 259
Points : 91
Points : 91
Par défaut ORDER BY dans requête avec UNION

Bonjour,

J'essaie d'effectuer un order by dans ma requête, mais à chaque fois j'obtiens une erreur. Voici ma requête :

Code :
1
2
3
4
5
 
SELECT MONTANT FROM MEMBRE WHERE ID = 46
UNION
SELECT MONTANT FROM MEMBRE WHERE id = 12
ORDER BY DATE_VALEUR
Et voici l'erreur que j'obtiens :

Citation:
ORA-00904: "DATE_VALEUR": invalid identifier
Petite précision inutile : le champs DATE_VALEUR existe bien dans ma table...
J'ai également essayer de mettre des alias, mais rien n'y fais
Ce n'est pas possible de définir un ordre lorsque l'on utilise UNION ou est-ce moi qui fais faux ?

Merci d'avance
gids01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2008, 16h38   #2
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
ca marchera mieux comme ca :

Code :
1
2
3
4
5
 
SELECT MONTANT, DATE_VALEUR  FROM MEMBRE WHERE ID = 46
UNION
SELECT MONTANT, DATE_VALEUR FROM MEMBRE WHERE ID = 12
ORDER BY DATE_VALEUR
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2008, 16h42   #3
Membre régulier
 
Inscription : octobre 2005
Messages : 259
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : octobre 2005
Messages : 259
Points : 91
Points : 91
Ok, super, merci beaucoup.

Je profite pour savoir si l'utilisation d'alias est utile dans mon cas ? (Au niveau performance ou autre)
En faisant par exemple :

Code :
1
2
3
4
5
 
SELECT M1.MONTANT, M1.DATE_VALEUR  FROM MEMBRE M1 WHERE ID = 46
UNION
SELECT M2.MONTANT, M2.DATE_VALEUR FROM MEMBRE M2 WHERE ID = 12
ORDER BY M1.DATE_VALEUR
gids01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2008, 16h55   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 453
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 453
Points : 4 215
Points : 4 215
Le order by s'effectue après la sélection de l'UNION. M1.datevaleur est inconnu, datevaleur est connu.
C'est comme si tu faisais
Code :
1
2
3
4
5
6
7
8
 
SELECT *
FROM 
(SELECT M1.MONTANT, M1.DATE_VALEUR  FROM MEMBRE M1 WHERE ID = 46
UNION
SELECT M2.MONTANT, M2.DATE_VALEUR FROM MEMBRE M2 WHERE ID = 12
)
ORDER BY M1.DATE_VALEUR
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/02/2008, 17h58   #5
Membre Expert
 
Avatar de scheu
 
Inscription : juin 2007
Messages : 1 497
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 1 497
Points : 1 485
Points : 1 485
Code :
1
2
3
4
SELECT M1.MONTANT "MONTANT", M1.DATE_VALEUR "DATE_VALEUR" FROM MEMBRE M1 WHERE ID = 46
UNION
SELECT M2.MONTANT "MONTANT", M2.DATE_VALEUR "DATE_VALEUR" FROM MEMBRE M2 WHERE ID = 12
ORDER BY DATE_VALEUR
ou
Code :
1
2
3
4
SELECT M1.MONTANT, M1.DATE_VALEUR  FROM MEMBRE M1 WHERE ID = 46
UNION
SELECT M2.MONTANT, M2.DATE_VALEUR FROM MEMBRE M2 WHERE ID = 12
ORDER BY 1
scheu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 08h00   #6
Membre régulier
 
Inscription : octobre 2005
Messages : 259
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : octobre 2005
Messages : 259
Points : 91
Points : 91
Super, merci beaucoup pour vos explications
gids01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 09h32   #7
Membre régulier
 
Inscription : octobre 2005
Messages : 259
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : octobre 2005
Messages : 259
Points : 91
Points : 91
Par défaut [Perfs] UNION vs Plusieurs requetes indépendantes

Bonjour,

J'aimerais savoir qu'est-ce qui est le mieux au niveau perfs entre une requete avec UNION du genre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
SELECT 	MONTANT, 1 
FROM 	MA_TABLE 
WHERE 	ID_M = 12 AND 
	DOMAINE = 'ACHAT' AND
	DATE_VALEUR = '09-feb-2008'
UNION
SELECT 	MONTANT, 2 
FROM 	MA_TABLE 
WHERE 	ID_M = 120 AND 
	DOMAINE = 'ACHAT' AND
	DATE_VALEUR = '12-feb-2008'
UNION
SELECT 	MONTANT, 3 
FROM 	MA_TABLE 
WHERE 	ID_M = 43 AND 
	DOMAINE = 'ACHAT' AND
	DATE_VALEUR = '15-feb-2008'
ORDER BY 2
Ou alors de faire 3 requêtes indépendantes (dans une seule transaction)

Pour ma part je pencherais sur le UNION, mais je ne sais pas trop ....

Merci d'avance
gids01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 09h48   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
D'abord, le UNION fait un tri pour supprimer les doublons, est-ce bien ce que tu veux ? Ensuite, pourquoi ne pas faire une seule requête :

Code :
1
2
3
4
5
SELECT 	MONTANT, DECODE(ID_M,12,1,120,2,43,3)
FROM 	MA_TABLE 
WHERE 	(ID_M,DATE_VALEUR) IN ((12,'09-feb-2008'),(120,'12-feb-2008'),(43,'15-feb-2008'))
AND  DOMAINE = 'ACHAT' 
ORDER BY 2
PS : j'ai fusionné tes 2 discussions qui traitent le même problème
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 10h02   #9
Membre régulier
 
Inscription : octobre 2005
Messages : 259
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : octobre 2005
Messages : 259
Points : 91
Points : 91
Citation:
PS : j'ai fusionné tes 2 discussions qui traitent le même problème
Oui, j'ai pas vraiment fais gaffe....

Alors non, je veux les doublons, j'ai regardé, il faut utiliser UNION ALL c'est ça ?

Une seule requête irait très bien mais le problème est que j'ai simplifié la requête pour le post :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
 
SELECT 	MONTANT, 1 
FROM 	CO_DWH_ANALYSE_FIN_DETAIL 
WHERE 	DO_TDOCSYS_CI = 'CLO' AND 
	DO_GENRE_DOC_ID = 46 AND
	DOMAINE = 'ACHAT' AND
	BASE_OU_ECHEANCE = 'BASE' AND
	DB_ELEMENT_ID = 5 AND
	DATE_VALEUR = '09-feb-2008'
UNION
SELECT 	MONTANT, 2 
FROM 	CO_DWH_ANALYSE_FIN_DETAIL
WHERE 	DO_TDOCSYS_CI = 'CLO' AND
	DO_GENRE_DOC_ID = 46 AND
	DOMAINE = 'ACHAT' AND
	BASE_OU_ECHEANCE = 'BASE' AND
	DB_ELEMENT_ID = 5 AND
	ANNEE = '2008' AND
	SEMAINE = '7'
UNION
SELECT 	MONTANT, 3
FROM	CO_DWH_ANALYSE_FIN_DETAIL
WHERE 	DO_TDOCSYS_CI = 'CLO' AND
	DO_GENRE_DOC_ID = 46 AND
	DOMAINE = 'ACHAT' AND
	BASE_OU_ECHEANCE = 'BASE' AND
	DB_ELEMENT_ID = 5 AND
	ANNEE = '2008' AND
	MOIS = '2'
UNION
SELECT 	MONTANT, 4
FROM	CO_DWH_ANALYSE_FIN_DETAIL
WHERE 	DO_TDOCSYS_CI = 'CLO' AND
	DO_GENRE_DOC_ID = 46 AND
	DOMAINE = 'ACHAT' AND
	BASE_OU_ECHEANCE = 'BASE' AND
	DB_ELEMENT_ID = 5 AND
	ANNEE = '2008' AND
	MOIS >= '1' AND MOIS <= '3'
UNION
SELECT 	MONTANT, 5
FROM	CO_DWH_ANALYSE_FIN_DETAIL
WHERE 	DO_TDOCSYS_CI = 'CLO' AND
	DO_GENRE_DOC_ID = 46 AND
	DOMAINE = 'ACHAT' AND
	BASE_OU_ECHEANCE = 'BASE' AND
	DB_ELEMENT_ID = 5 AND
	ANNEE = '2008' AND
	MOIS >= '1' AND MOIS <= '6'
UNION
SELECT 	MONTANT, 6
FROM 	CO_DWH_ANALYSE_FIN_DETAIL
WHERE 	DO_TDOCSYS_CI = 'CLO' AND
	DO_GENRE_DOC_ID = 46 AND
	DOMAINE = 'ACHAT' AND
	BASE_OU_ECHEANCE = 'BASE' AND
	DB_ELEMENT_ID = 5 AND
	ANNEE = '2008'
ORDER BY 2
Comme tu peux le voir, certains critères de la clause where ne sont utilisés que dans certaines requête, donc je vois pas trop comment je pourrais en faire qu'une seule ...

Encore merci pour ton aide
gids01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 10h24   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
En effet, UNION ALL ce serait pas plus mal alors. Et pour répondre à ta question, il vaut mieux une seule requête pour laisser l'optimiser chercher les données au mieux en fonction de tout ce qui est ramené
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 10h30   #11
Membre régulier
 
Inscription : octobre 2005
Messages : 259
Détails du profil
Informations personnelles :
Âge : 29

Informations forums :
Inscription : octobre 2005
Messages : 259
Points : 91
Points : 91
Super, merci beaucoup,

Je vais donc utiliser UNION ALL
gids01 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 03h17.


 
 
 
 
Partenaires

Hébergement Web