听起来有点迟钝,但有可能吗?
我有EMPLOYEE_ID和DEPARTMENT_ID,我必须根据DEPARTMENT_ID进行排序,而不使用ORDER BY。
它不应该出现在查询中的任何地方,例如在USING子句中、在子查询中、在SELECT语句中或在任何地方。
有可能吗?
谢谢。
发布于 2016-01-20 10:15:03
有几种方法可以根据特定的RDBMS工作,其中没有一种方法可以用于生产环境,但只是为了好玩:
<xsl:sort>。-- HIDDEN MESSAGE代替ORDER BY。(我承认,这并不完全是SQL解决方案)。DEPARTMENT_ID排序的表上创建一个索引(物化)视图,该视图将仅供此查询使用。不能保证每次都能工作。DEPARTMENT_ID上左转联接源表,并使用提示防止优化器重新排序联接。不能保证每次都能工作。Upd 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当应用、UNION、EXCEPT、INTERSECT或仅使用DISTINCT时,许多关系数据库管理系统引擎都会对结果进行排序,特别是当它们是单线程或被迫不使用带有提示的并行性时。不能保证每次都能工作。
发布于 2016-01-20 08:53:06
如果您要在表上创建第一个(或仅)键为DEPARTMENT_ID的索引,并且强制查询引擎使用此索引,则这是可能的。这也应该是一个普通的SELECT语句。
但即便如此,它也不能保证正确的排序顺序。
发布于 2016-01-20 08:56:31
也许这个链接能帮到你
sort results without use of order by clause
链接就是这么说的
你不能,至少不可靠。 一些SQL实现很可能会按主键或聚集索引的顺序返回行,但是SQL本身是一个关系代数,除非特别告诉它,否则它会返回任意有序的集合。 自创建表以来,返回行的顺序很有可能取决于插入和删除活动。
https://stackoverflow.com/questions/34895330
复制相似问题