没有ORDER BY的排序

时间:2016-01-20 08:49:42

标签: sql

这听起来很迟钝但是可能吗?

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

它不应出现在查询中的任何位置,即USING子句或SUB-QUERY或SELECT语句中或任何地方。

有可能吗?

谢谢。

4 个答案:

答案 0 :(得分:1)

如果您要在表上创建第一个(或唯一)键为DEPARTMENT_ID的索引,并且您将强制查询引擎使用此索引,那么这是可能的。这也应该是一个简单的SELECT陈述。

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

答案 1 :(得分:1)

有一些方法可以根据特定的RDBMS工作,但它们都不能在生产环境中使用,只是为了好玩:

  1. 使用XML输出并使用<xsl:sort>应用服务器端XSLT转换(例如通过CLR)。
  2. 使用存储过程以一个文本返回值生成排序列表。
  3. 使用-- HIDDEN MESSAGE编写自己的SQL代理客户端替换ORDER BY。 (我承认,这不完全是SQL解决方案)。
  4. 在按DEPARTMENT_ID排序的表格上创建一个索引(物化)视图,该视图将由此查询单独使用。 无法保证每次都能正常工作
  5. 以增量顺序创建包含所有可能ID的临时表,在DEPARTMENT_ID上创建左连接源表,并使用提示阻止优化程序重新排序连接。 无法保证每次都能正常工作
  6. 更新 6.当要排序的行数较少时,RDBMS支持的CTE递归深度:

    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
    

    更新 7.许多RDBMS引擎会在应用GROUP BYUNIONEXCEPTINTERSECT或仅{{1}时对结果进行排序特别是如果它们是单线程的或强制不使用带有提示的并行性。 无法保证每次都能正常工作

答案 2 :(得分:0)

可能这个链接可以帮到你

sort results without use of order by clause

这就是链接所说的

  

你不能,至少不可靠。

     

某些SQL实现可能会按其顺序返回行   主键或聚簇索引,但SQL本身是一个关系   除非特别说明,否则返回任意有序集的代数   否则。

     

返回行的顺序很有可能   很好地依赖于表格以来的插入和删除活动   创建

答案 3 :(得分:-1)

您可以在没有 ORDER BY 的情况下进行查询,将每一行放入多维数组中,然后对数组进行排序。它可以用多种语言完成。

在 PHP 中应该是这样的:

$result = [];
// In $result you put every row from your SELECT

$aSortField = [];

    foreach ($result as $key => $row)   
        {
        $aSortField [$key] = $row['theNameOfYourSortColumn'];
        }

    array_multisort($aLocal, SORT_ASC, $result);    // This makes the "order by" job