2010-03-07 15 views
1

C'est une tâche simplifiée que je dois résoudre en projet réel. Dans ce projet, les données sont stockées dans HSQLDB. Les données sont accédées en utilisant JDBC.Comment combiner deux ensembles de résultats d'une table triés indépendamment en utilisant une requête SQL?

J'ai une table:

name | flag 
----------- 
aa | 1 
bb | 0 
cc | 1 
dd | 0 
ee | 1 
ff | 0 

je dois composer requête pour obtenir le tableau suivant:

name | flag 
----------- 
aa | 1 
cc | 1 
ee | 1 
ff | 0 
dd | 0 
bb | 0 

La table finale est comme les lignes avec le drapeau = 1 ont été prises et triés croissant, les lignes avec flag = 0 ont été prises et triées en descendant et les résultats ont été combinés les uns après les autres.

S'il vous plaît, faites attention, que les rangées avec flag = 1 et les rangées avec flag = 0 ont opposé ordre de tri.

Est-il possible de faire en SQL? Je ne voudrais pas faire deux requêtes et fusionner les ResultSets en code Java manuellement.

Répondre

3

En tout SQL, seul l'ordre externe en applique donc il doit être fait là-bas.

Je ne sais pas si cela fonctionne dans votre dialecte SQL (et ne peut pas vérifier désolé), mais vous pouvez le faire

SELECT name, flag 
FROM 'table' 
ORDER BY 
    flag desc, 
    CASE WHEN flag = 1 THEN name ELSE '' END, 
    CASE WHEN flag = 0 THEN name ELSE '' END DESC 
+0

Merci, votre solution fonctionne dans HSQLDB. Mais pourriez-vous expliquer comment fonctionne le tri dans la base de données? Le moteur sélectionne les lignes, puis applique deux types d'expressions d'ordre soit: "flag desc, name, '' desc" (si flag = 1) ou ceci: "flag desc, '', name desc" (si flag = 0)? Je n'ai jamais rencontré d'expression dynamique "ordre par" avant. – ilya

+0

Il trie sur 3 colonnes, mais la colonne 2 ou la colonne 3 est une constante donc est effectivement ignoré – gbn

2

Essayez ceci:

SELECT name, flag 
FROM 'table' 
ORDER BY flag desc, name 

Laissez la base de données faire le travail à chaque fois que vous le pouvez. Ne faites pas de telles choses en Java. Pensez "SQL d'abord".

+0

S'il vous plaît, faites attention, ce nom de colonne dans les lignes où flag = 0 a l'ordre de tri opposé. – ilya

+0

S'il vous plaît écrivez une question cohérente et arrêtez d'être impoli. Je suis en train de voter pour votre question maintenant. – duffymo

+0

@Ilya: vous avez ajouté cette exigence après cette réponse – gbn

1

order by peut prendre plus d'une colonne:

select * 
from table 
order by flag desc, name asc