2009-05-29 9 views
3

J'ai une table qui a une colonne intitulée 'sortorder' qui est utilisée pour permettre au client de changer manuellement l'ordre de chaque article. La table comporte également une colonne intitulée "CategoryId". J'étais curieux, si j'étais en vrac d'importer un ensemble de données dans lequel je connaissais toutes les données, y compris CategoryId, comment je pourrais spécifier la valeur d'incrémentation pour 'SortOrder' dans la requête, de sorte qu'il soit passé de 1 à X dans chaque CategoryId unique.Incrémenter la valeur en fonction des critères dans une seule requête de base de données

Merci à tous.

Répondre

9

Je ne suis pas sûr de comprendre votre question mais je pense ce que vous demandez est comment synthétiser un SortOrder approprié lors d'une insertion dans la table. Vous devez utiliser ROW_NUMBER() avec le partitionnement par CategoryId. Bien sûr, vous aurez besoin de définir un critère de tri qui donne l'ordre de propert de « 1 à X »:

INSERT INTO myTable (SortOrder, CategoryId, <other columns> ...) 
SELECT ROW_NUMBER() OVER (PARTITION BY CategoryId ORDER BY mySortCriteria) 
    , CategoryId 
    , <other columns> ... 
    FROM SourceTable; 
+0

Vous avez sauvé ma journée, merci. Je connais ROW_NUMBER() pour SQL 2005, mais je ne connaissais pas le paramètre PARTITION BY. Merci beaucoup. –

+0

Fonctions de fenêtrage FTW! Peut ne pas fonctionner sur quelque chose d'autre SQL Server 2005, cependant. –

+0

bonne réponse - vous me battre à elle :) –

1

Sons comme vous besoin d'utiliser la fonction row_number dans votre importation.

INSERT MyTable(SortOrder, ...) 
SELECT SortOrder = row_number() over (partition by CatgoryID order by SomeOtherField), ... 
FROM MyTable 
0

Pour tous ceux qui pourraient venir plus tard et qui sont encore dans SQL Server 2000, voici une autre façon d'accomplir la tâche. Utilisation d'une table de transfert temporaire pour corriger les données de l'encart en masse. Assurez-vous qu'il a une colonne appelée sortorder qui est initialement remplie avec un 1 et une colonne d'identité basée sur l'identité.

alors vous pouvez mettre à jour ce avec une jointure réflexive, quelque chose comme

update t 
set sortorder = t1.sortorder +1 
from test t 
join Test t1 on t.id = t1.id+1 

Ensuite, placez les données dans votre table prod.

Questions connexes