更改行顺序

时间:2018-07-25 22:17:09

标签: sql-server tsql

我有一张这样的桌子:

+-------+--------------------------------------+------------------+--------------------------------------------------------+
| SecID |               SecGuid                |    LevelType     |                      Description                       |
+-------+--------------------------------------+------------------+--------------------------------------------------------+
|     1 | 550239E9-01A1-4403-8133-834DD0EBD7EA | Administrator    | All Access Pass                                        |
|     2 | 181104C8-2241-4E51-B73D-59D5E4E8C22D | Advanced Author  | Edit, create, delete, archive, pricing, and agreements |
|     3 | 24E50493-854C-4C44-A074-E6D2EAAC5E5C | Mid Level Author | Edit, create, delete and archive                       |
|     4 | 306C087D-F86A-43F6-B57A-8C65F9E8337D | Author           | Edit and create                                        |
|     5 | 9B66AE7D-B704-4D75-8776-774A2CFC0C47 | Contibutor       | Edit                                                   |
|     6 | 35B0F735-E240-47D0-9E33-694D6197C765 | Browser          | View                                                   |
|     7 | E3606250-F5C5-4DED-B29F-53E6C6C91FDA | Banned           | no access                                              |
|     8 | B0A0F8E1-93F3-431F-A7BF-95F14C22703E | Low Level Author | Edit, create, delete, archive, Task assignation        |
+-------+--------------------------------------+------------------+--------------------------------------------------------+

但是现在我想将我的最后一行更改为第三行,并将SecID更改为4,当然还要更改该行下的其他行。所以最终,我想实现以下目标:

+-------+--------------------------------------+------------------+--------------------------------------------------------+
| SecID |               SecGuid                |    LevelType     |                      Description                       |
+-------+--------------------------------------+------------------+--------------------------------------------------------+
|     1 | 550239E9-01A1-4403-8133-834DD0EBD7EA | Administrator    | All Access Pass                                        |
|     2 | 181104C8-2241-4E51-B73D-59D5E4E8C22D | Advanced Author  | Edit, create, delete, archive, pricing, and agreements |
|     3 | 24E50493-854C-4C44-A074-E6D2EAAC5E5C | Mid Level Author | Edit, create, delete and archive                       |
|     4 | B0A0F8E1-93F3-431F-A7BF-95F14C22703E | Low Level Author | Edit, create, delete, archive, Task assignation        |
|     5 | 306C087D-F86A-43F6-B57A-8C65F9E8337D | Author           | Edit and create                                        |
|     6 | 9B66AE7D-B704-4D75-8776-774A2CFC0C47 | Contibutor       | Edit                                                   |
|     7 | 35B0F735-E240-47D0-9E33-694D6197C765 | Browser          | View                                                   |
|     8 | E3606250-F5C5-4DED-B29F-53E6C6C91FDA | Banned           | no access                                              |
+-------+--------------------------------------+------------------+--------------------------------------------------------+

注意:表具有约束,SecID是主键:

ALTER TABLE [dbo].[SecAccess] ADD  CONSTRAINT [DF_SecAccess_SecGuid]  DEFAULT (newid()) FOR [SecGuid]

2 个答案:

答案 0 :(得分:1)

首先,从4开始向下移动行:

UPDATE dbo.SecAccess SET SecID = SecID + 1 WHERE SecID > 3;

然后移动最后一行,现在有了编号。 9至第4行:

UPDATE dbo.SecAccess SET SecID = 4 WHERE SecID = 9;

这假设SecID不是身份列。如果是一个,那就做

SET IDENTITY_INSERT dbo.SecAccess ON;
UPDATE dbo.SecAccess SET SecID = SecID + 1 WHERE SecID > 3;
UPDATE dbo.SecAccess SET SecID = 4 WHERE SecID = 9;
SET IDENTITY_INSERT dbo.SecAccess OFF;

请参阅:SET IDENTITY_INSERT (Transact-SQL)


一种为您提供更大灵活性的解决方案是引入一个仅用于排序的新列

ALTER TABLE dbo.SecAccess ADD SortOrder int;
UPDATE dbo.SecAccess SET SortOrder = CASE 
                                       WHEN SecID = 8 THEN 4
                                       WHEN SecID > 3 THEN SecID + 1
                                       ELSE SecID
                                     END;

答案 1 :(得分:0)

也许尝试:

update SecTable set SecID = 0 where SecID = 8;
update SecTable set SecID += 1 where SecID in (4,5,6,7);
update SetTable set SecID = 4 where SecID = 0;