我写了一个sql查询,如下所示 -
select
Customers.Id
from
customers
inner join opportunities
on customers.id=opportunities.customerid
group by
opportunities.customerId,
Customers.Id
order by
count(Opportunities.Id) desc
以上查询以机会ID计数的降序返回customes id。
我将上述查询作为子查询提供给另一个查询 -
select * from Customers where Id in ( above query)
但是我的最终查询没有返回相同的订单结果。它将我的结果顺序更改为升序。
如何像内部查询/子查询一样保持相同的记录顺序?
答案 0 :(得分:1)
在SQL
中,表格是无序的。子查询的结果被视为表格;因此它们是无序的。当子查询明确具有ORDER BY
时,这甚至可能是违反直觉的。顺便说一下,同样适用于观点也是如此。 SQL
数据库不需要在视图定义中支持ORDER BY。
换句话说,ORDER BY
用于向用户呈现最终数据。
我发现了解这一点的最佳方法是认识到表可以分割到不同的存储分区(table spaces
)。虽然用户倾向于认为table
是“文件”,但它可以(并且经常)存储在多个文件中。多个文件的记录之间没有固有的顺序。
在某些特殊情况下,ORDER BY
可以使用subquery
。例如,在支持TOP
或LIMIT
的数据库中,您可以使用order by指定您获得的特定行。这是我想到的唯一例外,但可能还有其他例外。
在任何情况下,解决方案都是将订单放在外query
上,正如其他答案所提出的那样。
答案 1 :(得分:0)
select
Customers.Id, count(Opportunities.Id) as cnt
from
customers
inner join opportunities
on customers.id=opportunities.customerid
group by
opportunities.customerId,
Customers.Id
外部查询中cnt的顺序
答案 2 :(得分:0)
select C.* from Customers C
INNER JOIN ( yourquery) T1 on T1.Id = C.id
order by Count desc
在第一个查询中,您需要设置
select
Customers.Id, Count(*) as [Count]
from (..)
并删除Order-By
答案 3 :(得分:0)
试试这个
从客户中选择*, (选择 Customers.Id, Row_Number()OVER(ORDER BY count(Opportunities.Id)desc)为row_num 从 顾客 内在联接的机会 在customers.id = opportunities.customerid 通过...分组 opportunities.customerId, Customers.Id)作为测试 Customers.ID = test.Id 按test.row_num排序