2013-01-03 6 views
1

J'ai ces requêtes:Trier par Date Desc question

(SELECT * FROM product WHERE var<>'0'ORDER BY date DESC) 

et

(SELECT * FROM product WHERE var='0' ORDER BY date DESC). 

Quand j'essaye d'unir le résultat des deux en un avec

(SELECT * FROM product WHERE var<>'0'ORDER BY date DESC) 
UNION 
(SELECT * FROM product WHERE var='0' ORDER BY date DESC) 

Le résultat perdre l'ordre par ... l'ensemble résultant a d'abord tous les enregistrements avec var non zéro, puis tous les enregistrements avec var zéro mais ils ne sont pas classés par date ... Singulièrement, l'ordre fonctionne ... Pourquoi? Je essayé d'utiliser un ordre unique par le résultat mais mélanger le dossier ayant var égal ou non à zéro ...

+0

S'agit-il simplement d'exemples de requêtes? Parce que l'Union est équivalente à 'SELECT * FROM produit WHERE var n'est pas NULL ORDER BY date DESC' –

+0

http://msdn.microsoft.com/en-us/library/ms180026.aspx Exemple C –

+0

non ce sont les vraies requêtes , et sont réellement faux :) –

Répondre

2

Je crois que ce que vous essayez de faire est pour le jeu de résultats mettant '0' dernier, puis commander chaque sous-ensemble par date. Dans ce cas, vous pouvez oublier le syndicat et le faire à la place:

SELECT * 
FROM product 
WHERE var IS NOT NULL 
ORDER BY CASE WHEN var = '0' THEN 2 ELSE 1 END, date DESC 
+0

c'est exactement ce que je voulais faire ... je n'ai jamais vu cette syntaxe auparavant: quelle est la signification de la clause "WHEN var = '0' THEN 2 ELSE 1 END". Je veux dire, cela sélectionne tous les produits commandés par quoi? –

+0

Il est en fait 'CAS QUAND puis [, ...] [SINON ] END'. Dans ce cas, si var est ''0 '' il retournera un 2, sinon un 1. Lors de la commande, il faudra d'abord les 1, puis les 2 - sélectionner tous les produits classés par" si c'est '0' ou pas ", puis par date –

+0

Il ya quelques autres exemples à http://www.tizag.com/sqlTutorial/sqlcase.php –

5

Vous devez appliquer l'ordre dernier:

SELECT * FROM product WHERE var<>'0' 
UNION 
SELECT * FROM product WHERE var='0' 
ORDER BY date DESC 

Modifier si vous la place veulent preserver l'ordre dans les deux parties, donc d'abord tout avec var<>'0' (en interne commandé par date DESC) et puis tout avec var='0' (en interne commandé par date DESC):

SELECT * FROM product WHERE var<>'0' 
UNION 
SELECT * FROM product WHERE var='0' 
ORDER BY 
    CASE WHEN var<>'0' THEN 0 ELSE 1 END ASC, 
    date DESC 
+0

C'est ce que je disais que j'ai essayé, mais mélangé tous les résultats –

+0

@ElisabettaFalivene: Edited ma réponse. –

+0

ce fut le point! merci :) –

0
SELECT * FROM product WHERE var<>'0' 
UNION 
SELECT * FROM product WHERE var='0' 
ORDER BY date DESC 

équivaut à:

SELECT * FROM product 
ORDER BY date DESC 
+3

sauf lorsque le 'var' a Nulls. –