为什么此SQL查询排序错误?

时间:2015-03-13 21:43:18

标签: sql sql-server

我正在运行以下查询以及#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;,但这不合适。

为什么这条记录会出现故障?对我来说,这种情况并没有多大意义。

有没有人有任何想法?

2 个答案:

答案 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想要的任何东西。