首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无定单分拣

无定单分拣
EN

Stack Overflow用户
提问于 2016-01-20 08:49:41
回答 4查看 10.1K关注 0票数 0

听起来有点迟钝,但有可能吗?

我有EMPLOYEE_IDDEPARTMENT_ID,我必须根据DEPARTMENT_ID进行排序,而不使用ORDER BY

它不应该出现在查询中的任何地方,例如在USING子句中、在子查询中、在SELECT语句中或在任何地方。

有可能吗?

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-01-20 10:15:03

有几种方法可以根据特定的RDBMS工作,其中没有一种方法可以用于生产环境,但只是为了好玩:

  1. 使用XML输出并将服务器端XSLT转换(例如通过CLR )应用于<xsl:sort>
  2. 使用存储过程在一个文本返回值中生成排序列表。
  3. 编写自己的SQL客户端,用-- HIDDEN MESSAGE代替ORDER BY。(我承认,这并不完全是SQL解决方案)。
  4. 在按DEPARTMENT_ID排序的表上创建一个索引(物化)视图,该视图将仅供此查询使用。不能保证每次都能工作。
  5. 按增量顺序创建带有所有可能in的临时表,在DEPARTMENT_ID上左转联接源表,并使用提示防止优化器重新排序联接。不能保证每次都能工作。

Upd 6.当需要排序的行较少时,RDBMS支持CTE递归深度:

代码语言:javascript
复制
With Example (EMPLOYEE_ID, DEPARTMENT_ID) As (
        Select 4, 2 Union All
        Select 5, 2 Union All
        Select 6, 3 Union All
        Select 7, 3 Union All
        Select 2, 1 Union All
        Select 3, 1 Union All
        Select 1, 1
    ),
    Stringified (ID) AS (
        Select
            RIGHT('0000000000' + CAST(DEPARTMENT_ID AS NVARCHAR(10)), 10) +
            RIGHT('0000000000' + CAST(EMPLOYEE_ID AS NVARCHAR(10)), 10)
        From Example
    ),
    Sorted (PREV_EMPLOYEE_ID, PREV_DEPARTMENT_ID,
            NEXT_EMPLOYEE_ID, NEXT_DEPARTMENT_ID) As (
        Select
            CAST(Right(ex1.ID, 10) AS INT),
            CAST(Left(ex1.ID, 10) AS INT),
            CAST(Right(Min(ex2.ID),10) AS INT),
            CAST(Left(Min(ex2.ID),10) AS INT)
        From Stringified ex1
        Inner Join Stringified ex2 On ex1.ID < ex2.ID
        Group By ex1.ID
    ),
    RecursiveCTE (EMPLOYEE_ID, DEPARTMENT_ID) AS (
        Select
            CAST(Right(Min(ID),10) AS INT),
            CAST(Left(Min(ID),10) AS INT)
        From Stringified
        Union All
        Select NEXT_EMPLOYEE_ID, NEXT_DEPARTMENT_ID
        From Sorted
        Inner Join RecursiveCTE
             ON RecursiveCTE.EMPLOYEE_ID = Sorted.PREV_EMPLOYEE_ID
            AND RecursiveCTE.DEPARTMENT_ID = Sorted.PREV_DEPARTMENT_ID
    )
Select *
From RecursiveCTE

当应用UNIONEXCEPTINTERSECT或仅使用DISTINCT时,许多关系数据库管理系统引擎都会对结果进行排序,特别是当它们是单线程或被迫不使用带有提示的并行性时。不能保证每次都能工作。

票数 2
EN

Stack Overflow用户

发布于 2016-01-20 08:53:06

如果您要在表上创建第一个(或仅)键为DEPARTMENT_ID的索引,并且强制查询引擎使用此索引,则这是可能的。这也应该是一个普通的SELECT语句。

但即便如此,它也不能保证正确的排序顺序。

票数 1
EN

Stack Overflow用户

发布于 2016-01-20 08:56:31

也许这个链接能帮到你

sort results without use of order by clause

链接就是这么说的

你不能,至少不可靠。 一些SQL实现很可能会按主键或聚集索引的顺序返回行,但是SQL本身是一个关系代数,除非特别告诉它,否则它会返回任意有序的集合。 自创建表以来,返回行的顺序很有可能取决于插入和删除活动。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34895330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档