Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
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 26/11/2004, 10h11   #1
Invité de passage
 
Inscription : mai 2002
Messages : 19
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 19
Points : 3
Points : 3
Envoyer un message via AIM à Abidou
Par défaut Est-ce que la clause ORDER BY n'est pas utilisée avec UNION

Bonjour à tous,

J'arrive pas a exécuter une requette SQL interbase contenat une clause ORDER BY avec UNION :

Code :
1
2
3
4
5
SELECT * FROM fichier1
union
SELECT * FROM fichier1
WHERE condition1
ORDER BY chps1
- Les fichiers (Fichier1 et fichier2) ont exactement la même structure
- la clause ORDER BY est utilisée à la fin de la requette

NB. Sans ORDER BY, la requette s'execute sans problème.
Abidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2004, 10h41   #2
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Dans votre exemple il n'y a pas de fichier2.

Faute de frappe sans doute,

Il faut éviter les select * ensuite pour ce qui est du tri suite à un union il faut lui indiquer non pas le nom de la colonne mais son numéro.

Code :
1
2
3
4
5
6
7
SELECT chps1 
  FROM fichier1 
union 
SELECT chps1 
  FROM fichier1 
  WHERE condition1 
ORDER BY 1;
Mais cette exemple est exactement l'équivallent de
Code :
1
2
3
4
5
6
SELECT chps1 
  FROM fichier1 
union 
SELECT chps1 
  FROM fichier1 
  WHERE condition1;
Car en effet le union enlevant les doublons il tri les données dans l'ordre des colonnes. Donc si vous ne voulez pas utiliser le order by N°de colonne vous n'avez qu a mettre dans vos select les colonnes que vous souhaitez trier en premier.
C'est d'ailleur recommandé de le faire pour éviter un double traitement (Le tri de l'union puis le tri de l'order by (si celui ci est un order by n avec n>1)).

Pour un "UNION ALL" il faudra par contre utiliser le order by x pour trier le résultat.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2004, 15h48   #3
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

Informations professionnelles :
Activité : Architecte de base de données
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Par défaut Re: Est-ce que la clause ORDER BY n'est pas utilisée avec UN

Code :
1
2
3
4
5
6
7
8
9
 
SELECT * 
FROM (
SELECT * FROM fichier1
union
SELECT * FROM fichier1
WHERE condition1
) R
ORDER BY 1
__________________

Découvrez la FAQ de MS SQL Server.
La chance accorde ses faveurs aux esprits avertis !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2004, 16h44   #4
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Par défaut Re: Est-ce que la clause ORDER BY n'est pas utilisée avec UN

Citation:
Envoyé par WOLO Laurent
Code :
1
2
3
4
5
6
7
8
9
 
SELECT * 
FROM (
SELECT * FROM fichier1
union
SELECT * FROM fichier2
WHERE condition1
) R
ORDER BY 1
: :

1- qu'apporterait de plus cette solution par rapport à un simple
Code :
1
2
3
4
5
6
7
  SELECT *
    FROM fichier1 
union 
  SELECT * 
    FROM fichier1 
    WHERE condition1 
ORDER BY 1;
?
2- De plus les sous select n'étant pas autorisés avec Interbase/Firebird celà ne fonctionnera pas.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2004, 16h54   #5
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

Informations professionnelles :
Activité : Architecte de base de données
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Ah !
Je ne me rendais plus compte qu'Interbase était encore à l'âge de la pièrre taillée alors que même mysql s'en est tiré de cette situation.
__________________

Découvrez la FAQ de MS SQL Server.
La chance accorde ses faveurs aux esprits avertis !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2004, 17h15   #6
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Ce n'est pas très diplomate de venir dans le forum Interase/Firebird pour dire que c'est un "SGBD de l'age de pierre".

MySQL sait il exécuter des procédures stoquées ? sait il gérer les triggers ? Gère t il le versionning des enregistrements ? Entre autres questions...

Le SGBD parfait n'existe pas, il faut choisir celui qui convient le plus à ses besoins et affinitées.

Pour faire des sous select avec interbase/Firebird c'est assez simple en utilisant les vues ou dans une procédure stoquées.

Mais vous n'avez pas répondu à ma première question ???
Qu'apporte de plus votre solution ?
Enfin je pose la question, mais pour être honnete, je connais la réponse
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2004, 17h23   #7
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

Informations professionnelles :
Activité : Architecte de base de données
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
Vous voyez très bien que dans votre requête, le resultat est l'union du premier select + le deuxième avec le fait le resultat du deuxième est trié.

Par contre, dans ma version, Le resultat de l'union est trié sur le champ 1.
Vous vous rendez vraiment compte que c'est different sinon éclairer moi maître Barbibulle !
__________________

Découvrez la FAQ de MS SQL Server.
La chance accorde ses faveurs aux esprits avertis !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2004, 17h35   #8
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
C'est là que vous faites erreur, le order by se réfère à l'ensemble de l'union.
http://sql.developpez.com/sqlaz/ensembles/#L3.4.4

En d'autre terme quand il y a un UNION, il ne peut y avoir qu'un seul ORDER BY et il se trouve à la fin. Il ne se réfère pas au dernier select mais au résultat de l' (ou des) union(s).

Ma requete va bien trier comme il le faut.

Et la votre donne le même résultat sur un SGBD qui accepte les sous select mais l'écriture est plus lourde et probablement moins performante.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2004, 17h41   #9
Rédacteur/Modérateur

 
Avatar de WOLO Laurent
 
Homme Laurent WOLO
Architecte de base de données
Inscription : mars 2003
Messages : 2 696
Détails du profil
Informations personnelles :
Nom : Homme Laurent WOLO
Âge : 35
Localisation : Congo-Brazzaville

Informations professionnelles :
Activité : Architecte de base de données
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 2 696
Points : 3 917
Points : 3 917
Envoyer un message via Yahoo à WOLO Laurent
sauf qu'ici il s'agit d'un Order by mais pas un group by.
A mois que ca soit la même chose ?
__________________

Découvrez la FAQ de MS SQL Server.
La chance accorde ses faveurs aux esprits avertis !
WOLO Laurent est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2004, 18h12   #10
Membre Expert
 
Avatar de Barbibulle
 
Frédéric
Inscription : octobre 2002
Messages : 1 722
Détails du profil
Informations personnelles :
Nom : Frédéric
Âge : 42

Informations forums :
Inscription : octobre 2002
Messages : 1 722
Points : 2 025
Points : 2 025
Désolé il faut lire dans mon message précédent ORDER BY et non GROUP BY. Merci de la remarque, je vais éditer mon message pour éviter les confusions.
Barbibulle est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/11/2004, 10h12   #11
Invité de passage
 
Inscription : mai 2002
Messages : 19
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 19
Points : 3
Points : 3
Envoyer un message via AIM à Abidou
Merci à tous ceux qui m'ont répendu,

Je m'excuse pour l'erreur de frappe fichier2.

J'est utilisé la solution de vue proposé dans le forum et ça à marcher.

Merci Barbecule j'ai utilisé aussi ta solution qui est plus simple.

Merci encore.
Abidou 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 08h57.


 
 
 
 
Partenaires

Hébergement Web