Calcul de SQL Server ROW_NUMBER () OVER () pour une table dérivée
Dans d'autres bases de données (par exemple, DB2 ou Oracle avec ROWNUM
), je peux omettre le ORDER BY
clause dans une fonction de classement est OVER()
clause. Par exemple:
ROW_NUMBER() OVER()
Ceci est particulièrement utile lorsqu'il est utilisé avec commandés tables dérivées, telles que:
SELECT t.*, ROW_NUMBER() OVER()
FROM (
SELECT ...
ORDER BY
) t
Comment cela peut-il être imité dans SQL Server? J'ai trouvé des gens à l'aide de cette astucemais c'est faux, car il va se comporter de manière non-déterministe avec la commande de la table dérivée:
-- This order here ---------------------vvvvvvvv
SELECT t.*, ROW_NUMBER() OVER(ORDER BY (SELECT 1))
FROM (
SELECT TOP 100 PERCENT ...
-- vvvvv ----redefines this order here
ORDER BY
) t
Un exemple concret (comme on peut le voir sur SQLFiddle):
SELECT v, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
FROM (
SELECT TOP 100 PERCENT 1 UNION ALL
SELECT TOP 100 PERCENT 2 UNION ALL
SELECT TOP 100 PERCENT 3 UNION ALL
SELECT TOP 100 PERCENT 4
-- This descending order is not maintained in the outer query
ORDER BY 1 DESC
) t(v)
Aussi, je ne peux pas réutiliser tout l'expression de la dérivée de la table de reproduire le ORDER BY
clause dans mon cas, comme la table dérivée peut ne pas être disponible comme elle peut être fournie par certains logique externe.
Alors, comment puis-je le faire? Puis-je le faire?
source d'informationauteur Lukas Eder
Vous devez vous connecter pour publier un commentaire.
La
Row_Number() OVER (ORDER BY (SELECT 1))
truc devrait PAS être considérée comme un moyen d'éviter de changer l'ordre des données sous-jacentes. Il n'est qu'un moyen d'éviter de causer du serveur pour effectuer supplémentaires et inutiles (il peut toujours effectuer le tri, mais ça va coûter le montant minimum possible, comparativement à un traitement de tri par colonne).Toutes les requêtes dans SQL server DOIT ABSOLUMENT ont un
ORDER BY
clause dans le ultrapériphériques de la requête pour que le résultat soit fiable commandé dans un moyen de garantie.Le concept de "garder la commande d'origine" n'existe pas dans les bases de données relationnelles. Les Tables et les requêtes doivent toujours être considérés comme des non-ordonnée jusqu'à ce que et à moins qu'une
ORDER BY
clause est spécifié dans la limite extérieure de la requête.Vous pouvez essayer de le même non ordonnée de la requête de 100 000 fois et toujours le recevoir avec la même commande, et donc de croire que vous pouvez compter sur dit de la commande. Mais ce serait une erreur, parce qu'un jour, quelque chose va changer et il n'aura pas l'ordre que vous attendez. Un exemple est le cas où une base de données est mise à niveau vers une nouvelle version de SQL Server--ce qui a causé de nombreux une requête pour modifier sa commande. Mais il n'a pas à être un gros changement. Quelque chose d'aussi peu que de l'ajout ou de la suppression d'un index peut provoquer des différences. Et en plus: l'Installation d'un service pack. Le partitionnement d'une table. Création d'une vue indexée qui comprend la table en question. De parvenir à un certain point de basculement où une analyse est choisi à la place d'une recherche. Et ainsi de suite.
Ne comptez pas sur les résultats à être commandés, sauf si vous avez dit "Serveur,
ORDER BY
".