这听起来很迟钝但是可能吗?
我有EMPLOYEE_ID
和DEPARTMENT_ID
我必须根据DEPARTMENT_ID
对其进行排序,而不使用ORDER BY
。
它不应出现在查询中的任何位置,即USING
子句或SUB-QUERY或SELECT语句中或任何地方。
有可能吗?
谢谢。
答案 0 :(得分:1)
如果您要在表上创建第一个(或唯一)键为DEPARTMENT_ID
的索引,并且您将强制查询引擎使用此索引,那么这是可能的。这也应该是一个简单的SELECT
陈述。
但即便如此,它也无法保证正确的排序顺序。
答案 1 :(得分:1)
有一些方法可以根据特定的RDBMS工作,但它们都不能在生产环境中使用,只是为了好玩:
<xsl:sort>
应用服务器端XSLT转换(例如通过CLR)。-- HIDDEN MESSAGE
编写自己的SQL代理客户端替换ORDER BY
。 (我承认,这不完全是SQL解决方案)。DEPARTMENT_ID
排序的表格上创建一个索引(物化)视图,该视图将由此查询单独使用。 无法保证每次都能正常工作。DEPARTMENT_ID
上创建左连接源表,并使用提示阻止优化程序重新排序连接。 无法保证每次都能正常工作。更新 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 BY
,UNION
,EXCEPT
,INTERSECT
或仅{{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