Insert into Select 没有正确插入相同的数据顺序

Posted

技术标签:

【中文标题】Insert into Select 没有正确插入相同的数据顺序【英文标题】:Insert into Select does not insert the same data order correctly 【发布时间】:2015-07-30 10:45:40 【问题描述】:

我在 SQL Server 2014 中使用了 insert into 命令,但没有按照数据的相同顺序插入。

它显示的行数相同,但与您在下图中看到的数据顺序不同。

插入命令是:

insert into [test].[dbo].[HöjdKortvågVänster] ([Höjd kortvåg vänster (null)]) select [Höjd kortvåg vänster (null)] from [test].[dbo].[test111]

图 1:源表的选择命令

图 2:目标表的选择命令

我能做些什么来解决这个问题?

【问题讨论】:

您的数据根据​​您的聚集索引定义进行物理存储和排序。 ORDER BY 子句在 INSERT 操作期间被忽略。 谢谢@gotqn。那么,我应该怎么做才能将它作为相同的顺序插入呢? @gotqn Order By 在插入期间不会被忽略。他只是根本没有使用它。 有人问这个问题:***.com/questions/14424929/… "Preserving ORDER BY in SELECT INTO" @gotqn - 数据并不总是以聚集索引键顺序物理存储***.com/questions/1251636/… 【参考方案1】:

SQL 结果集是无序的,除非您有order by。 SQL 表是无序的。

但是,SQL Server 至少提供了一种方法来满足您的需求。如果您在具有identity 列的表中使用order by并且select 具有order by,则标识会适当增加。

所以,做你想做的事情的一种方法是在[HöjdKortvågVänster]中拥有诸如列:

id int not null identity(1, 1) primary key

insert into [test].[dbo].[HöjdKortvågVänster]([Höjd kortvåg vänster (null)]) 
    select [Höjd kortvåg vänster (null)]
    from [test].[dbo].[test111]
    order by <appropriate column here>;

然后当你查询表时,记住order by

select *
from [test].[dbo].[HöjdKortvågVänster]
order by id;

【讨论】:

你认为我需要源表和目标表中的 ID 吗? @YAcaCsh,您将需要ORDER BY 中的INSERT...SELECT...ORDER BY 的一些源列,不一定必须是IDENTITY。如果您使用第二个ORDER BY,则目的地将需要IDENTITY。如果您在源和目标中都有相同的列,那么您可能根本不需要IDENTITY 目的地需要一个identity 列。完成插入后,insertselect 中都需要一个 order by

以上是关于Insert into Select 没有正确插入相同的数据顺序的主要内容,如果未能解决你的问题,请参考以下文章

SELECT INTO 和 INSERT INTO SELECT

select into from 和 insert into select的使用

select into 与 insert into select

使用 insert into ... select 会导致 select 附近的语法不正确,为啥?

INSERT INTO SELECT 语句

求助~~ INSERT INTO....SELECT怎么一次性插入多行数据