2010-04-26 3 views
3

J'utilise ADS v10 beta. J'essaie de numérer des résultats ordonnés.Advantage Database Server ORDER BY comportement

1) ORDER BY dans les requêtes imbriquées. Je dois utiliser imbriquée SELECT pour certains calculs:

SELECT Name, Value, ROWNUM() FROM (SELECT * FROM MainTable WHERE Value > 0 ORDER BY Value) a 

Et je reçois

Expected lexical element not found:) 
There was a problem parsing the table 
names after the FROM keyword in your 
SELECT statement. 

Tout fonctionne bien quand ORDER BY est supprimée. Bien que, j'ai trouvé l'échantillon dans l'aide, il ressemble à ma requête (plus complexe, en effet):

SELECT * FROM (SELECT TOP 10 empid, fullname FROM branch1 ORDER BY empid) a UNION SELECT empid, fullname FROM branch2 ORDER BY empid 

2) ORDER BY + ROWNUM(). J'ai utilisé la requête imbriquée dans l'exemple ci-dessus pour calculer les rangées ordonnées. Est-il possible d'éviter les requêtes imbriquées? Dans le serveur SQL que je peux faire quelque chose comme ceci:

SELECT Name, Value, ROW_NUMBER() OVER(ORDER BY Value) FROM MainTable WHERE Value > 1 ORDER BY Value 

conseils S'il vous plaît. Merci.

Répondre

4

Je pense que vous devez déplacer ORDER BY en dehors de la sous-requête:

SELECT Name, Value, ROWNUM() FROM 
    (SELECT * FROM MainTable WHERE Value > 0) a ORDER BY Value 

Si vous manquez le rownum() à appliquer à l'ensemble de résultats commandé (je suis un peu lent ce matin) , alors il pourrait être nécessaire d'utiliser quelque chose comme ce qui suit:

SELECT Name, Value, ROWNUM() FROM 
    (SELECT top 100 PERCENT * FROM MainTable WHERE Value > 0 order by value) a 

Je ne pense pas ORDER BY dans la sous-requête est permis à moins qu'il ne change réellement le résultat ... mais dans ce cas, il ne semble comme il devrait être autorisé.

+0

Votre suggestion pourrait être simplifiée à "SELECT Nom, Valeur, ROWNUM() FROM MainTable WHERE Valeur> 0 ORDER BY Valeur" N'est-ce pas? Dans la deuxième partie "2)" de ma question, j'ai écrit pourquoi cela ne fonctionne pas. –

+0

@ie: Oui, il est équivalent à cette requête. Cependant, je ne crois pas que la clause OVER soit prise en charge (dans la deuxième requête). –

+0

@ Mark Wilkins: oui, semble tellement ... merci. –

0

Utilisez des alias dans vos instructions pour le rendre plus clair et probablement pour résoudre le problème.

Plutôt que:

SELECT Name, Value, ROWNUM() 
FROM (SELECT * FROM MainTable WHERE Value > 0 ORDER BY Value) a 

Utilisez

SELECT a.Name, a.Value, ROWNUM() 
FROM (SELECT mt.* FROM MainTable mt WHERE mt.Value > 0 ORDER BY mt.Value) a 

Le problème est peut-être qu'il confond le champ value dans la clause order by - il ne sait pas quelle table pour l'obtenir à partir, le 1er ou le 2e.

+0

1er ou 2e? Pourquoi? J'utilise seulement une table. –

+0

Peu importe, ne fonctionne pas. –

+0

Vos questions semblent avoir radicalement changé depuis que j'ai répondu. Mais dans votre requête d'origine, 'a' est un ensemble d'enregistrements et maintable est un autre ensemble d'enregistrements. – MJB