dum*_*dad 19 t-sql sql-server sql-order-by select-into
我有一个tSQL查询,它从一个表中获取数据并将其复制到一个新表中,但只有满足特定条件的行:
SELECT VibeFGEvents.*
INTO VibeFGEventsAfterStudyStart
FROM VibeFGEvents
LEFT OUTER JOIN VibeFGEventsStudyStart
ON
CHARINDEX(REPLACE(REPLACE(REPLACE(logName, 'MyVibe ', ''), ' new laptop', ''), ' old laptop', ''), excelFilename) > 0
AND VibeFGEventsStudyStart.MIN_TitleInstID <= VibeFGEvents.TitleInstID
AND VibeFGEventsStudyStart.MIN_WinInstId <= VibeFGEvents.WndInstID
WHERE VibeFGEventsStudyStart.excelFilename IS NOT NULL
ORDER BY VibeFGEvents.id
Run Code Online (Sandbox Code Playgroud)
使用该表的代码依赖于它的顺序,上面的副本不保留我预期的顺序.也就是说,新表VibeFGEventsAfterStudyStart中的行在VibeFGEventsAfterStudyStart.id复制的列中不会单调增加VibeFGEvents.id.
在TSQL怎么可能我是从维护中行的排序VibeFGEvents中VibeFGEventsStudyStart?
小智 23
做什么的?
点是 - 表中的数据没有排序.在SQL Server中,表的固有存储顺序是(如果已定义)聚簇索引的存储顺序.
插入数据的顺序基本上是"无关紧要的".忘记数据写入表格的那一刻.
因此,即使你得到这些东西也没有任何收获.如果在处理数据时需要订单,则必须在获取它的选择上放置order by子句.任何其他内容都是随机的 - 即您的数据顺序未确定且可能会发生变化.
因此,当您尝试实现时,在插入上具有特定顺序是没有意义的.
SQL 101:集合没有订单.
Mic*_*ael 20
我知道这有点旧,但我需要做类似的事情.我想将一个表的内容插入到另一个表中,但是以随机顺序插入.我发现我可以通过使用select top n和来做到这一点order by newid().没有'top n',订单没有保留,第二个表的行与第一个表的顺序相同.然而,对于'top n',保留了顺序(在我的情况下是随机的).我使用的值'n'大于行数.所以我的查询是这样的:
insert Table2 (T2Col1, T2Col2)
select top 10000 T1Col1, T1Col2
from Table1
order by newid()
Run Code Online (Sandbox Code Playgroud)
Gre*_*Gum 11
只需top在 sql 中添加一个大于实际行数的数字即可:
SELECT top 25000 *
into spx_copy
from SPX
order by date
Run Code Online (Sandbox Code Playgroud)
我发现了一个特定的场景,我们希望按照列内容中的特定顺序创建新表:
SELECT INTO而不是CREATE TABLE + INSERT因为需要尽可能快地加载(最少的日志记录)。我们已经测试使用跟踪标志 610加载已创建的具有聚集索引的空表,但仍然比以下方法花费更长的时间。CLUSTERED INDEX在表加载后立即创建一个。我们放弃创建非聚集索引,因为它需要再次读取索引中未包含在有序列中的数据,并且我们放弃创建完全覆盖的非聚集索引,因为它实际上会使所需的空间量增加一倍保持桌子。如果您设法以某种方式创建包含已“排序”的列的表,则创建聚集索引(具有相同的顺序)所需的时间比数据未排序时要少得多。有时(您必须测试您的情况),对 中的行进行排序SELECT INTO比不按顺序加载并稍后创建聚集索引要快。
问题是 SQL Server 2012+ORDER BY在执行INSERT INTO或 时会忽略列列表SELECT INTO。ORDER BY如果您在插入的表上指定IDENTITY列SELECT INTO或插入的表具有列,它将考虑这些IDENTITY列,但只是为了确定标识值而不是基础表中的实际存储顺序。在这种情况下,排序可能会发生,但不能保证,因为它高度依赖于执行计划。
我们发现的一个技巧是,如果您有一个列表,则SELECT INTO对 a 的结果执行UNION ALLa 会使引擎执行 a SORT(并不总是显式SORT运算符,有时是 aMERGE JOIN CONCATENATION等)ORDER BY。这样,select into 就已经按照我们稍后创建聚集索引的顺序创建了新表,因此创建索引所需的时间更少。
所以你可以重写这个查询:
SELECT
FirstColumn = T.FirstColumn,
SecondColumn = T.SecondColumn
INTO
#NewTable
FROM
VeryBigTable AS T
ORDER BY -- ORDER BY is ignored!
FirstColumn,
SecondColumn
Run Code Online (Sandbox Code Playgroud)
到
SELECT
FirstColumn = T.FirstColumn,
SecondColumn = T.SecondColumn
INTO
#NewTable
FROM
VeryBigTable AS T
UNION ALL
-- A "fake" row to be deleted
SELECT
FirstColumn = 0,
SecondColumn = 0
ORDER BY
FirstColumn,
SecondColumn
Run Code Online (Sandbox Code Playgroud)
我们已经使用过这个技巧几次了,但我不能保证它总是能排序。我只是将其发布为一种可能的解决方法,以防有人遇到类似的情况。