插入..按[重复]顺序选择

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 缺少右括号问题 - 在插入查询中按顺序选择

NSDictionary 按字母顺序排序[重复]

按给定列表的顺序选择重复的熊猫数据框行并保留原始索引

Java HashMap 按键插入时间排序 - 创意顺序 [重复]

按插入顺序检索核心数据实体