9
votes

SQL Server Row_Number () sur SQL Server 2000?

J'ai une requête qui me permet d'obtenir des enregistrements d'une table de base de données en lui donnant une limite minimale et maximale.

Il va comme ceci: P>

  SELECT T1.CDUSUARIO, T1.DSALIAS, T1.DSNOMBRE_EMPRESA, T1.DSCARGO, T1.DSDIRECCION_CORREO, T1.CDUSUARIO_ADMINISTRADOR, T1.FEMODIFICACION 
    FROM (SELECT *, 
               ROW_NUMBER() OVER (ORDER BY CDUSUARIO) as row FROM TBL_USUARIOS ) as T1 
   WHERE row > @limiteInf 
     and row <= @limiteSup 
ORDER BY DSALIAS ASC;


0 commentaires

4 Réponses :


2
votes

Utilisez une autre fonction ou mettez à niveau votre base de données. Row_Number n'existait pas dans la version 2000 de la base de données. Point. Rien que vous puissiez faire à ce sujet.


3 commentaires

Cela ne semble pas très utile. Il sait évidemment que ce n'est pas en 2000, le message d'erreur lui dit cela.


@nathan Gonzalez: C'est vraiment la vérité de base: il n'y a pas de substitut élégant


Exactement. Downvoting Becasue Vous n'aimez pas que la vérité ne soit pas utile non plus, vous savez. c'est la vérité. La fonction a été introduite plus tard 2000 car elle manquait. Il n'y a pas de même substitut de performance.



11
votes
  • Il y a un compte (*) avec une solution de jointure auto ici qui va échouer mal
  • Vous pouvez charger une table Temp avec une colonne d'identité et lire, mais il n'est pas garanti de travailler (ne peut pas trouver d'article dessus, a été racontée il y a une époque de MS séminaire)

    aucune solution ne supporte la partition par

    Je n'ai pas mentionné des solutions à base de boucle ou de curseur qui sont probablement pires

    EDIT 20 MAI 20011

    Exemple de démonstration de la raison pour laquelle l'identité ne fonctionnera pas: Les enregistrements insérés reçoivent toujours des valeurs d'identité contiguës


2 commentaires

+1: le comte / la join Self est également plus comme en utilisant le rang / dense_rank, car les doublons auront la même valeur


"Aucune solution ne supporte la partition par". Vous pouvez regrouper lors du chargement à la table TEMP. Ajoutez ensuite l'identité pour obtenir une pièce d'identité pour chaque groupe. Vous pouvez ensuite rejoindre cette table TEMP à votre requête d'origine.



4
votes

Je sais que ce fil est peu vieux, mais pour quelqu'un d'autre à la recherche de même solution, je pense qu'il sera utile de savoir qu'il existe une bonne solution à ce problème.

Veuillez voir le lien d'origine ici P>

Pour ceux qui ne veulent pas cliquer sur le lien, j'ai copié et collé le code ci-dessous. Encore une fois, le crédit va à Editeur d'origine P>

ici est Le SQL ci-dessous pour SQL Server 2000 pour sélectionner la dernière version d'un groupe d'enregistrements par une seule colonne. P>

SELECT * FROM (SELECT *, ROW_NUMBER() OVER(PARTITION BY PartitionByColumn 
    ORDER BY OrderByColumn DESC) AS rowNumber FROM MyTable) AS rw1 
  WHERE rw1.rowNumber = 1


0 commentaires

-1
votes

Ceci est ma solution au problème: xxx

explication:

  1. Créer une table de mémoire
  2. Insérez des données (votre requête) avec le numéro de ligne comme 0
  3. Mettez à jour le champ Numéro de ligne avec une variable INT qui est incrémenté dans la même mise à jour pour l'enregistrement suivant (la variable est en réalité incrémentée d'une part, puis de la mise à jour de 1)
  4. "Sélectionnez" le résultat de la table mémoire.

    Vous pouvez demander, pourquoi n'a-t-je pas utiliser la variable dans la déclaration SELECT? Ce serait plus simple mais cela n'est pas autorisé, seulement s'il n'y a pas de résultat. Il est correct de le faire dans une mise à jour.


1 commentaires

S'il vous plaît expliquer ce que vous faites là-bas