插入..按[重复]顺序选择
Posted
技术标签:
【中文标题】插入..按[重复]顺序选择【英文标题】:Insert into..Select with order by [duplicate] 【发布时间】:2016-01-12 14:23:32 【问题描述】:我在将数据按特定顺序从另一个表插入到表中时遇到问题。我希望按列排序数据Niveau
我的查询是这样的:
IF OBJECT_ID('tempdb..#DISPLAYVALUEALL') IS NOT NULL
DROP TABLE #DISPLAYVALUEALL
SELECT
Ecritures.RecIdLine AS RecIdLine,
Ecritures.DISPLAYVALUEComb AS DISPLAYVALUEComb,
LevelTable.DIMENSIONATTRIBUTE AS DimAttribute,
LevelTable.LEVEL_ AS Niveau,
DimAttr.Name AS Dim_Label
INTO
#DISPLAYVALUEALL
FROM
#BudgetTransTmp As Ecritures
INNER JOIN
#InterfacesParmTmp AS Tmp1 ON Tmp1.DATAAREAID = Ecritures.DATAAREAID
INNER JOIN
MicrosoftDynamicsAx.dbo.DIMENSIONHIERARCHYLEVEL As LevelTable ON LevelTable.DIMENSIONHIERARCHY = Ecritures.ACCOUNTSTRUCTURE
AND LevelTable.PARTITION = @Partition
AND LevelTable.DIMENSIONATTRIBUTE IN (Tmp1.TaskCode, Tmp1.Activity, Tmp1.BudgetNature, Tmp1.CentreCout)
INNER JOIN
MicrosoftDynamicsAx.dbo.DIMENSIONATTRIBUTE As DimAttr ON DimAttr.RECID = LevelTable.DIMENSIONATTRIBUTE
AND DimAttr.PARTITION = @Partition
ORDER BY
RecIdLine,DISPLAYVALUEComb , Niveau ASC, DimAttribute DESC
--SELECT * from #DISPLAYVALUEALL
这不起作用。在 select into 语句中使用 order by 是否违法?
这是我的结果
ReciID DisplayValue Dimension Niveau
5637157342 601200-001-026-- 22565421189 5
5637157342 601200-001-026-- 22565421195 2
5637157342 601200-001-026-- 22565421196 3
5637157342 601200-001-026-- 22565421197 4
5637157326 601200-001-027-- 22565421189 5
5637157326 601200-001-027-- 22565421195 2
5637157326 601200-001-027-- 22565421196 3
5637157326 601200-001-027-- 22565421197 4
谢谢!
更新:我的解决方案是添加这一行:
Row_number() over(ORDER BY Ecritures.RecIdLine, Ecritures.DISPLAYVALUEComb, LevelTable.LEVEL_ ASC, LevelTable.DIMENSIONATTRIBUTE DESC) as RowNumber,
我的脚本变成了:
IF OBJECT_ID('tempdb..#DISPLAYVALUEALL') IS NOT NULL
DROP TABLE #DISPLAYVALUEALL
SELECT Row_number() over(ORDER BY Ecritures.RecIdLine ,Ecritures.DISPLAYVALUEComb , LevelTable.LEVEL_ asc, LevelTable.DIMENSIONATTRIBUTE desc) as RowNumber,
Ecritures.RecIdLine AS RecIdLine,
Ecritures.DISPLAYVALUEComb AS DISPLAYVALUEComb,
LevelTable.DIMENSIONATTRIBUTE AS DimAttribute,
LevelTable.LEVEL_ AS Niveau,
DimAttr.Name AS Dim_Label
INTO #DISPLAYVALUEALL
FROM #BudgetTransTmp As Ecritures
INNER JOIN #InterfacesParmTmp AS Tmp1
ON Tmp1.DATAAREAID = Ecritures.DATAAREAID
INNER JOIN MicrosoftDynamicsAx.dbo.DIMENSIONHIERARCHYLEVEL As LevelTable
ON LevelTable.DIMENSIONHIERARCHY = Ecritures.ACCOUNTSTRUCTURE
AND LevelTable.PARTITION = @Partition
AND LevelTable.DIMENSIONATTRIBUTE IN (Tmp1.TaskCode,Tmp1.Activity, Tmp1.BudgetNature, Tmp1.CentreCout)
INNER JOIN MicrosoftDynamicsAx.dbo.DIMENSIONATTRIBUTE As DimAttr
ON DimAttr.RECID = LevelTable.DIMENSIONATTRIBUTE
AND DimAttr.PARTITION = @Partition
ORDER BY RowNumber
现在数据在我检查的表中排序:
SELECT * from #DISPLAYVALUEALL
【问题讨论】:
表格中的行没有按逻辑顺序排列。如果您希望最后一个SELECT
以特定顺序显示数据,那就是,您应该在其中添加 ORDER BY
子句。
为什么要在插入之前排序数据?
因为我在第二张桌子上需要这个订单。我发现了一些东西检查我的更新
就像我说的,数据没有在表格中排序。 (如果您有一个聚集索引,那么数据可以按该顺序物理存储,这可能有助于提高效率,但仍然不能保证它会以SELECT
语句的顺序出来 .) 如果您在没有ORDER BY
的情况下执行SELECT
,那么服务器可以按照它认为合适的任何顺序为您提供数据,并且可以从一分钟到下一分钟发生变化。您只是将ORDER BY
放在您想要从中排序结果的SELECT
上有什么问题?
您的“解决方案”可能随时中断。正如我所说,如果您在SELECT
语句中没有ORDER BY
,则服务器可能会以任何顺序返回行。仅仅因为它今天按照你想要的顺序出现,并不意味着它明天就会按照你想要的顺序出现。
【参考方案1】:
订购插件没有目的
如果没有一个选择的顺序,则没有保证顺序
您需要移动 ORDER BY
SELECT * from #DISPLAYVALUEALL
ORDER BY RecIdLine, DISPLAYVALUEComb , Niveau asc, DimAttribute desc
或者你可以直接使用
SELECT * from #DISPLAYVALUEALL
ORDER BY RowNumber
【讨论】:
我目前正在使用它:Row_number() over(ORDER BY Ecritures.RecIdLine ,Ecritures.DISPLAYVALUEComb , LevelTable.LEVEL_ asc, LevelTable.DIMENSIONATTRIBUTE desc) as RowNumber,
我认为订单还可以
我可以看到你在用什么。第二次“在没有选择订单的情况下没有保证订单”。【参考方案2】:
尝试将您的选择查询更改如下并再次执行:
SELECT T.*
INTO #DISPLAYVALUEALL
FROM (SELECT
Ecritures.RecIdLine AS RecIdLine,
Ecritures.DISPLAYVALUEComb AS DISPLAYVALUEComb,
LevelTable.DIMENSIONATTRIBUTE AS DimAttribute,
LevelTable.LEVEL_ AS Niveau,
DimAttr.Name AS Dim_Label
FROM #BudgetTransTmp As Ecritures
INNER JOIN #InterfacesParmTmp AS Tmp1
ON Tmp1.DATAAREAID = Ecritures.DATAAREAID
INNER JOIN MicrosoftDynamicsAx.dbo.DIMENSIONHIERARCHYLEVEL As LevelTable
ON LevelTable.DIMENSIONHIERARCHY = Ecritures.ACCOUNTSTRUCTURE
AND LevelTable.PARTITION = @Partition
AND LevelTable.DIMENSIONATTRIBUTE IN (Tmp1.TaskCode,Tmp1.Activity, Tmp1.BudgetNature, Tmp1.CentreCout)
INNER JOIN MicrosoftDynamicsAx.dbo.DIMENSIONATTRIBUTE As DimAttr
ON DimAttr.RECID = LevelTable.DIMENSIONATTRIBUTE
AND DimAttr.PARTITION = @Partition
ORDER BY RecIdLine,DISPLAYVALUEComb , Niveau asc, DimAttribute desc) T
【讨论】:
谢谢,我想我找到了一些东西。我更新了我的问题 @stoner 尝试使用相同的原理:创建子查询 我测试了你的解决方案,但它给了我这个错误:The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.
@stoner 首先,尝试在没有 INTO 命令的情况下执行您的 sql 查询,只需选择
@stoner 它会给你结果吗?如果否,则表示选择查询不正确以上是关于插入..按[重复]顺序选择的主要内容,如果未能解决你的问题,请参考以下文章
ORA-00907 缺少右括号问题 - 在插入查询中按顺序选择