我正在运行以下查询以及#34;重新排序"按字母顺序更新的表格。这是一个名为nOrder的列,它应该按顺序排列。我按如下方式更新该列:
(编辑:忘记在我的问题中包含AND @zone = zone
,但同样的问题正在发生)
UPDATE Zones
SET nOrder = 0 WHERE stateKey = @key
DECLARE @zone INT
SET @zone = 1
DECLARE @i INT
SET @i = 1
WHILE @zone < 4
BEGIN
WHILE EXISTS (SELECT TOP 1 cDisplay FROM Zones WHERE stateKey = @key AND zone = @zone AND nOrder = 0)
BEGIN
UPDATE Zones
SET nOrder = @i
WHERE cDisplay = (SELECT TOP 1 cDisplay FROM Zones WHERE stateKey = @key AND zone = @zone AND nOrder = 0 ORDER BY cDisplay)
SET @i += 1
END
SET @zone += 1
set @i = 1
END
然后表格成为:
FK zone cDisplay nOrder
.
.
.
.
10 3 MD: CAROLINE, DORCHESTER, KENT 40
10 3 MD: QUEEN ANNE'S 41
10 3 MD: SOMERSET, TALBOT, WILCOMICO 42
10 3 ME: PORTLAND 43
10 3 ME: YORK 44
.
.
.
.
10 3 TX: COUNTIES NORTH OF HOUSTON 99
10 3 TX: DALLAS-FORT WORTH OUTER SUBURBAN 100
10 3 TX: EL PASO 101
10 3 TX: MATAGORDA AND VICTORIA COUNTIES 102
10 3 TX: NORTHEAST COUNTIES 103
10 3 TX: SAN ANTONIO OUTER SUBURBAN AREAS 104
10 3 TX: SOUTHERN TEXAS 43 --???
10 3 TX: TYLER 105
.
.
.
.
&#34; FK&#34;实际上是&#34; stateKey&#34;,但这不合适。
为什么这条记录会出现故障?对我来说,这种情况并没有多大意义。
有没有人有任何想法?
答案 0 :(得分:6)
如何更容易地做到这一点?我想你想要:
WITH toupdate as (
select z.*, row_number() over (partition by zone order by cDisplay) as seqnum
from zones z
where stateKey = @key AND nOrder = 0
)
UPDATE toupdate
set nOrder = seqnum;
变量@zone
已设置但未在您的代码中使用(至少,它不会影响更新)。我不确定它应该做什么 - 但我怀疑这与您的代码问题有关。无论如何,使用CTE和排名函数是解决此问题的更好方法。
答案 1 :(得分:-1)
每当你使用&#34; SELECT TOP ...&#34;时,你必须使用ORDER BY子句。否则你得到一个未定义的顺序,可以是SQL Optimizer想要的任何东西。