Sélectionnez sous-ensemble de lignes à l'aide de la fonction Row_Number()
Select id, name, ROW_NUMBER() OVER (ORDER BY id asc) as 'RowNo'
from customers
where RowNo between 50 AND 60
Je suis en train de sélectionner un sous-ensemble de lignes entre 50 et 60 . Le problème est RowNo " est un nom de colonne non valide.
Merci
À l'aide de SQL SERVER 2008 R2
S'il vous plaît ne pas utiliser
P. S. le débat est à propos de ce que vous doit utilisation. Il y a peu d'argument que les guillemets simples ne devrait pas être utilisée.
thnx, je n'étais pas sûr si c'était obsolète ou n'est pas autorisé dans la dernière version.
Il travaille toujours dans les versions actuelles, mais elle soulève des obsolète événements d'avertissement (trace/perfmon). Ainsi, seules certaines formes de soulever obsolète événements, mais c'est une autre histoire.
'string delimiters'
pour alias. Cette syntaxe est non-standard, peuvent être très confus (par exemple SELECT 'a' 'b'
), et est déconseillée dans SQL Server. Utilisation [square brackets]
(pas la norme), ou "double quotes"
(standard), ou pas de délimiteurs. Pour plus d'infos et beaucoup de débat, voir sqlblog.com/blogs/aaron_bertrand/archive/2012/01/23/...P. S. le débat est à propos de ce que vous doit utilisation. Il y a peu d'argument que les guillemets simples ne devrait pas être utilisée.
thnx, je n'étais pas sûr si c'était obsolète ou n'est pas autorisé dans la dernière version.
Il travaille toujours dans les versions actuelles, mais elle soulève des obsolète événements d'avertissement (trace/perfmon). Ainsi, seules certaines formes de soulever obsolète événements, mais c'est une autre histoire.
OriginalL'auteur test | 2012-02-17
Vous devez vous connecter pour publier un commentaire.
Utiliser votre requête comme une sous-requête comme ci-dessous:
Vous pouvez utiliser CTE ainsi, mais s'il faut choisir l'une ou l'autre de lire La différence entre le CCE et le sous-Requête? et vérification du plan d'exécution.
Parce que SQL Server n'a pas de
LIMIT x OFFSET y
, comme MySQL. Il a seulementTOP n
qui est le même que MySQLLIMIT n
.Mais avec des fonctions analytiques qu'il n'ont, comme les
ROWN_NUMBER()
et les autres, vous pouvez faire beaucoup plus de choses compliquées (qui sont vraiment difficile à faire avec MySQL).SQL Server 2012 met en œuvre le méthode pour la pagination (
OFFSET
/FETCH
). Bien sûr, MySQL est simple, mais c'est non-standard. J'ai blogué à ce sujet ici: sqlblog.com/blogs/aaron_bertrand/archive/2010/11/10/...est un alias pour la sous-requête, sans elle, vous obtiendrez un message d'erreur (vous pouvez l'essayer). Plus à ce sujet syntaxe Incorrecte près de quelque chose en utilisant une sous-requête.
OriginalL'auteur Michał Powaga
Vous avez besoin de faire quelque chose comme ceci:
Utiliser une expression de table commune (Common Table Expression - une sorte de "vue intégrée") comme un "wrapper" de sorte que votre
RowNo
devient un nom de colonne valide.Comme outlook - avec SQL Server 2012, vous seriez capable d'écrire quelque chose comme ceci:
SQL Server 2012 aura cette Norme SQL ANSI conforme à la notation de faire de la pagination directement fondée sur une
ORDER BY
clause. Consultez cet article de blog (ou des tonnes d'autres) pour plus d'infos et plus d'échantillons.AS RowNo
n'a pas besoin de guillemets:'RowNo'
, n'est ce pas?Ce n'est pas, mais il n'est pas faux non plus. C'est juste moins syntaxe commune à voir avec T-SQL.
Je ne pense pas que c'est absolument nécessaire, j'ai juste laissé que l'OP avait posté. Personnellement, je voudrais utiliser le
RowNo = ROW_NUMBER().....
notation - mais c'est juste le style personnelbeurk et marc, voir mon commentaire à la question (dont je suis parti avant que j'ai vu de ces commentaires). Je me rends compte marc juste copié les OP du code, mais bien que la syntaxe n'est pas mal aujourd'hui ce sera mauvais dans une future version de SQL Server.
OriginalL'auteur marc_s