2009-11-03 9 views
1

Ma table SQL comporte deux champs ayant un impact sur mon problème: "Priorité" en tant que réel et Date_Date en tant que date/heure. Lorsque l'utilisateur ajoute des éléments à la table, il spécifie la priorité pour un Start_Date donné.Mise à jour SQL par ligne

Si Item1 Priorité 1, alors peut-être Item2 priorité 2 et il sera donné un start_date après le point 1.

Mais si Item2 priorité est donnée à 0,5 (ou un nombre inférieur à la priorité de Item1), puis sa date_début sera avant date_début de l'élément 1.

Après chaque élément est ajouté, je veux passer par la liste des articles et mettre à jour toutes les priorités afin qu'ils sont des nombres entiers, en commençant par la première start_date avec une priorité = 1, 2, 3, etc.

Je travaille avec SQL 2005. Je sais que je peux le faire avec un curseur. Y a-t-il un meilleur moyen? Comment?

Merci.

Répondre

0

Si tous les startdatetimes sont uniques, essayez ceci (à l'intérieur d'un Begin Trans afin que vous puissiez examiner le résultat et rollback si ce n'est pas ce que vous voulez)

Update Table Set 
    Priority = (Select Count(*) From table 
       Where Start_Date <= T.Start_Date) 
    From Table T 
    Where Start_Date > getDate() 

si elles ne sont pas uniques, vous obtiendrez des lignes avec la même Priorité, (où les DateTimes sont les mêmes) et quelques lacunes dans les Séquences de Priorité ...

+0

Je vais essayer votre solution car je vois maintenant qu'il y a des items avec des Start_Dates identiques. Les éléments avec Start_Dates identiques commencent avec des priorités identiques et doivent se retrouver avec des priorités identiques. Je vous remercie! Je vous ferai savoir si cela fonctionne au besoin. –

+0

Amélioration supplémentaire: les éléments en cours de modification doivent tous avoir Start_Dates> Today. Dois-je ajouter la clause where supplémentaire dans la sous-requête? Par exemple: Update Tableau = Définir la priorité (Select Count (*) A partir du tableau Où start_date <= T.Start_Date Et start_date> = Getdate()) À partir du tableau T –

+0

Les redémarrages de numérotation avec chaque four. J'ai réussi à ajouter une clause where pour cela. Cependant, si deux éléments ou plus ont la même priorité avant la mise à jour (et commencent donc en même temps), ils doivent avoir la même priorité après la mise à jour. Comment puis-je faire cela? Jusqu'à présent, j'ai: Mise à jour tblTable = Définir la priorité \t (SELECT COUNT (*) \t De tblTable \t Où start_date <= T.Start_Date et \t convert (datetime, start_date, 101)> = @ CutoffDate et Furnace_Name = T.Furnace_Name) De la table T –

0

Vous pouvez le faire avec une table temporaire. Il pourrait y avoir de meilleurs moyens, mais je ne peux pas y penser maintenant. Cela suppose également que vous avez une clé primaire sur votre table - si ce n'est que la date de début et la priorité alors cette solution ne serait pas réalisable.

create table #tempOrder (newPriority int identity, 
         id int) 

insert into #tempOrder (id) select id from table order by Start_Date 

update table set priority = newPriority 
    from #tempOrder 
    where #tempOrder.id = table.id 

Une chose que je ne comprends pas avec votre problème est la mention d'une priorité de 0,5. Vous mentionnez que les priorités sont attribuées dans l'ordre de la date de début, mais mentionnez également la définition manuelle d'une priorité à 0,5. Quand cela se produirait-il? Quel devrait être le comportement si la date de début de cette priorité entre en conflit avec l'ordre des priorités par date de début?

+0

Un nouvel Item est inséré où sa Priorité est supérieure à toutes les précédentes et moins que tous ceux qui sont plus grands que lui. Ainsi, un utilisateur peut spécifier une priorité de 3,5 et cet élément sera alors inséré dans la table avec un Start_Date = à la End_Date de l'Item avec la Priorité la plus haute inférieure à 3.5. S'il n'y a pas d'éléments ayant une priorité <3.5, la première Start_Date sera attribuée. –

0
UPDATE mt 
SET Priority = 
    (
    SELECT COUNT(*) 
    FROM MyTable mt2 
    WHERE mt2.Start_Date <= mt.Start_Date 
    ) 
FROM MyTable mt