FirebirdSQL logo

Tri des éléments par UNION

Les parties des sélections SELECT qui participent à une union UNION ne peuvent pas être triées à l’aide de la clause ORDER BY. Cependant, vous pouvez obtenir le résultat souhaité en utilisant des tables dérivées ou des expressions de tables communes.La clause ORDER BY écrite en dernier dans l’union sera appliquée à l’ensemble de la sélection et non à la dernière partie de celle-ci. Pour les unions, les seuls éléments de tri possibles sont des littéraux entiers indiquant les positions des colonnes, pas nécessairement accompagnés des directives ASC | DESC et/ou NULLS {FIRST | LAST}.

Exemples

Dans la requête ci-dessous, la sélection sera triée en ordre croissant par les colonnes RDB$CHARACTER_SET_ID, RDB$COLLATION_ID de la table RDB$COLLATIONS :

SELECT
    RDB$CHARACTER_SET_ID AS CHARSET_ID,
    RDB$COLLATION_ID AS COLL_ID,
    RDB$COLLATION_NAME AS NAME
FROM RDB$COLLATIONS
ORDER BY RDB$CHARACTER_SET_ID, RDB$COLLATION_ID

Idem, mais trié par alias de colonne :

SELECT
    RDB$CHARACTER_SET_ID AS CHARSET_ID,
    RDB$COLLATION_ID AS COLL_ID,
    RDB$COLLATION_NAME AS NAME
FROM RDB$COLLATIONS
ORDER BY CHARSET_ID, COLL_ID

La requête suivante est triée, par numéro de colonne :

SELECT
    RDB$CHARACTER_SET_ID AS CHARSET_ID,
    RDB$COLLATION_ID AS COLL_ID,
    RDB$COLLATION_NAME AS NAME
FROM RDB$COLLATIONS
ORDER BY 1, 2

Comme mentionné ci-dessus, ce tri est également acceptable, mais non recommandé :

SELECT *
FROM RDB$COLLATIONS
ORDER BY 3, 2

Dans cette requête, la deuxième colonne de la table BOOKS est triée :

SELECT
    BOOKS.*,
    FILMS.DIRECTOR
FROM BOOKS, FILMS
ORDER BY 2
Warning

Notez que les expressions dont le résultat doit être un entier non négatif seront interprétées comme des numéros de colonne et soulèveront une exception si elles ne sont pas comprises entre 1 et le nombre de colonnes.

SELECT
  X, Y, NOTE
FROM PAIRS
ORDER BY X+Y DESC

Notes :

  • Le nombre renvoyé par une fonction ou une procédure à partir d’un UDF ou d’une procédure stockée est imprévisible, que le tri soit défini par l’expression elle-même ou par le numéro de colonne ;

  • Seuls les entiers non négatifs sont interprétés comme un numéro de colonne. Un nombre entier obtenu par un seul calcul d’une expression ou d’une substitution de paramètre est mémorisé comme une constante entière, puisque cette valeur est la même pour toutes les lignes.

Trier dans l’ordre décroissant des valeurs de la colonne PROCESS_TIME avec les valeurs NULL placées au début de la sélection :

SELECT *
FROM MSG
ORDER BY PROCESS_TIME DESC NULLS FIRST

Tri d’un échantillon obtenu en combinant les échantillons de deux requêtes. L’échantillon est trié par valeurs décroissantes dans la deuxième colonne avec les valeurs NULL à la fin de la liste et par valeurs croissantes dans la première colonne avec les valeurs NULL au début de la liste.

SELECT
  DOC_NUMBER, DOC_DATE
FROM PAYORDER
UNION ALL
SELECT
  DOC_NUMBER, DOC_DATE
FROM BUDGORDER
ORDER BY 2 DESC NULLS LAST, 1 ASC NULLS FIRST