为啥 ORDER BY 不对这个查询进行排序?

Posted

技术标签:

【中文标题】为啥 ORDER BY 不对这个查询进行排序?【英文标题】:Why is ORDER BY not sorting this query?为什么 ORDER BY 不对这个查询进行排序? 【发布时间】:2014-01-16 04:57:33 【问题描述】:

我正在使用WITH SELECT INTO 构建一个新表,并且我希望根据FLOAT 列之一按降序对值进行排序。这是原始代码(最后一行是我尝试排序结果的地方):

WITH attributionErrorCandidates AS 
(
    SELECT 
        a.ID aID,
        a.FREQUENCY aFREQ,
        MAX(dbo.JaroWInkler(a.NAME,b.NAME)) score,
        ROW_NUMBER() OVER(PARTITION BY a.ID ORDER BY MAX(dbo.JaroWInkler(a.NAME,b.NAME)) DESC) RN,
        b.ID bID,
        b.FREQUENCY bFREQ
    FROM #brandDivisionAttributionCounts a
    JOIN #brandDivisionAttributionCounts b
    ON a.BRAND_LEVEL = b.BRAND_LEVEL
    AND a.DIVISION = b.DIVISION
    AND a.ID <> b.ID
    AND a.NAME <> b.NAME
    GROUP BY a.ID,b.ID,a.FREQUENCY,b.FREQUENCY
)
SELECT
    bdac.NAME AS NAME,
    bdac.FREQUENCY AS NAME_FREQUENCY,
    bdac2.NAME AS OTHER_NAME,
    bdac2.FREQUENCY AS OTHER_NAME_FREQUENCY,
    score AS CONFIDENCE,
    #brandLevels.NAME AS BRAND_LEVEL,
    bdac.DIVISION AS DIVISION
INTO ArmanS.attributionErrorRankings
FROM attributionErrorCandidates
INNER JOIN #brandDivisionAttributionCounts AS bdac
    ON bdac.ID = aID
    AND RN = 1
    AND score > @scoreCutOff
INNER JOIN #brandDivisionAttributionCounts AS bdac2
    ON bdac2.ID = bID
INNER JOIN #brandLevels
    ON bdac.BRAND_LEVEL = #brandLevels.ID
WHERE bdac.FREQUENCY / bdac2.FREQUENCY > @requiredRatio
ORDER BY score DESC -- doesn't seem to work!

我尝试将score 替换为cast(score AS FLOAT)DIVISION 无济于事。结果不按分数排序(在结果表中称为DIVISION)。

【问题讨论】:

看看这个问题的公认答案,***.com/questions/14424929/… 重要的是要记住唯一的“自然顺序”是聚集索引,因为我们可以使用它。在优化性能时,理解和利用这种自然顺序非常重要,因为 Order By (==Sort) 是一项非常昂贵的操作。例如,如果我正在制作一个像您这样的表作为临时表,并且我想以相同的顺序多次使用它,我可能会在插入之前为键列创建一个聚集索引 - 从而只对它进行排序一次(在插入期间)。 @MikeM - 聚集索引本身并没有什么特别之处。 任何索引,如果它被覆盖并且与ORDER BY子句请求的排序顺序相同,则可以帮助服务器避免需要执行实际的排序操作。 @Damien_The_Unbeliever - 确实如此。谢谢。 【参考方案1】:

不保证使用 select 语句返回结果的顺序。只需在您的选择语句中下订单即可。

【讨论】:

在 select 语句上有 is 一个 ORDER BY(尽管在给定的代码中它是“无用的”)。问题在于ArmanS.attributionErrorRankings以后使用 没有隐式排序。

以上是关于为啥 ORDER BY 不对这个查询进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

mysql中order by分别 按两张表相同的属性排序为啥结果不一样

SQLAlchemy:如何对关系字段的查询结果(order_by)进行排序?

高手们 为啥数据库查询语句加了order by 变得很慢 表中有六千多条记录 现在打开很慢 啥原因

mysql使用order by排序查询导致sql变慢

MySQL ORDER BY:对查询结果进行排序

MySQL 查询常用操作——排序 order by