如何在不更改SQL Server中的值的情况下将整行从最后一行移到第3位

时间:2017-08-16 06:36:06

标签: sql-server

这是我的表:

DocumentTypeId   DocumentType    UserId       CreatedDtm
--------------------------------------------------------------------------
2d47e2f8-4       PDF             443f-4baa    2015-12-03 17:56:59.4170000
b4b-4803-a       Images          a99f-1fd     1997-02-11 22:16:51.7000000
600-0e32         XL              e60e07a6b    2015-08-19 15:26:11.4730000 
40f8ff9f         Word            79b399715    1994-04-23 10:33:44.2300000
8230a07c         email           750e-4c3d    2015-01-10 09:56:08.1700000

如何在DocumentType=email位置(3rd)上移动最后一行(before DocumentType=XL)而不更改表值?

3 个答案:

答案 0 :(得分:0)

不希望否认其他人在此处所说的真相,SQL Server确实具有CLUSTERED索引。有关这些以及群集表与非群集表之间差异的完整详细信息,请参阅here。实际上,群集表确实以索引顺序将数据写入磁盘。但是,由于后续的插入和删除,您不应该依赖任何给定的记录处于固定的序数位置。

要让您的数据显示第三个电子邮件和XL第四个,您只需要通过CreatedDtm订购。因此:

declare @test table
(
DocumentTypeID varchar(20),
DocumentType varchar(10),
UserID varchar(20),
CreatedDtm datetime
)
INSERT INTO @test VALUES
('2d47e2f8-4','PDF','443f-4baa','2015-12-03 17:56:59'),
('b4b-4803-a','Images','a99f-1fd','1997-02-11 22:16:51'),
('600-0e32','XL','e60e07a6b','2015-08-19 15:26:11'),
('40f8ff9f','Word','79b399715','1994-04-23 10:33:44'),
('8230a07c','email','750e-4c3d','2015-01-10 09:56:08')

SELECT * FROM @test order by CreatedDtm

这给出了一个结果集:

40f8ff9f    Word    79b399715   1994-04-23 10:33:44.000
b4b-4803-a  Images  a99f-1fd    1997-02-11 22:16:51.000
8230a07c    email   750e-4c3d   2015-01-10 09:56:08.000
600-0e32    XL  e60e07a6b   2015-08-19 15:26:11.000
2d47e2f8-4  PDF 443f-4baa   2015-12-03 17:56:59.000

这可能是你正在寻找的,但我不能强调,它只在这种特殊情况下给出了第3和第4的电子邮件。如果日期不同,那就不一样了。但也许,这就是你所需要的一切?

答案 1 :(得分:0)

我认为您需要按DocumentType列排序。

加入一个临时表,其中可能包含DocumenTypes虚拟SortOrder,您可以获得所需的结果。

declare @tbl table(
DocumentTypeID varchar(50),
DocumentType varchar(50)
)

insert into @tbl(DocumentTypeID, DocumentType)
values
('2d47e2f8-4','PDF'),
('b4b-4803-a','Images'),
('600-0e32','XL'),
('40f8ff9f','Word'),
('8230a07c','email')
;

--this will give you original output
select * from @tbl;


--this will output rows with new sort order
select t.* from @tbl t
inner join 
(
    select * 
    from 
        (values
            ('PDF',1, 1),
            ('Images',2, 2),
            ('XL',3, 4),
            ('Word',4, 5),
            ('email',5, 3) --here I put new sort order '3'
    ) as dt(TypeName, SortOrder, NewSortOrder)
) dt
on dt.TypeName = t.DocumentType
order by dt.NewSortOrder

答案 2 :(得分:-1)

行位置在SQL表格中并不重要,因为它是所有无序数据集,但如果您真的想要切换行,我建议您将所有数据发送到临时表,例如,

compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile 'com.github.paolorotolo:appintro:4.0.0'
compile 'com.google.firebase:firebase-core:11.0.4'
compile 'com.google.firebase:firebase-database:11.0.4'
compile 'com.google.firebase:firebase-auth:11.0.4'
compile 'com.android.support:design:25.3.1'
compile 'com.google.android.gms:play-services-maps:11.0.4'
testCompile 'junit:junit:4.12'

然后删除/截断该表中的数据(如果它不会弄乱它所连接的其他表)并使用您所插入的临时表,因为它&# 39; ll具有与原始数据相同的所有相同字段。