1

我写了一个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 计数的降序返回客户 id。

我将上述查询作为另一个查询的子查询作为-

select * from Customers where Id in ( above query)

但我的最终查询没有返回相同的订单结果。它正在将我的结果顺序更改为升序。

如何保持与内部查询/子查询相同的记录顺序?

4

4 回答 4

1

SQL中,表是无序的。子查询的结果被视为一个表;因此它们是无序的。当子查询显式具有ORDER BY. 顺便说一下,观点也是如此。SQL数据库不需要在视图定义中支持 ORDER BY 。

换句话说,ORDER BY是为了将最终数据呈现给用户。

我发现理解这一点的最好方法是认识到表可以跨不同的存储分区 ( table spaces)。尽管用户倾向于认为 atable是一个“文件”,但它可以(并且通常是)存储在多个文件中。多个文件的记录之间没有固有的顺序。

在某些特殊情况下,ORDER BY可以用在subquery. 例如,在支持TOPor的数据库中LIMIT,您可以使用 order by 来指定您获得的特定行。这是唯一想到的例外,但可能还有其他例外。

在任何情况下,解决方案都是将 order by 放在 external 上query,正如其他答案所建议的那样。

于 2012-08-03T13:21:23.300 回答
0

试试这样

select * from Customers, (select Customers.Id, Row_Number() OVER(ORDER BY count(Opportunities.Id) desc) as row_num 从customers.id=opportunities.customerid 组的客户内部加入机会中按opportunities.customerId, Customers.Id ) 作为测试,其中 Customers.ID=test.Id 按 test.row_num 排序

于 2012-08-03T13:13:52.883 回答
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 排序

于 2012-08-03T13:05:29.230 回答
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

于 2012-08-03T13:06:38.300 回答