如果给予子查询,如何按查询结果按顺序保持顺序?

时间:2012-08-03 13:01:52

标签: linq sql-order-by

我写了一个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)

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

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

4 个答案:

答案 0 :(得分:1)

SQL中,表格是无序的。子查询的结果被视为表格;因此它们是无序的。当子查询明确具有ORDER BY时,这甚至可能是违反直觉的。顺便说一下,同样适用于观点也是如此。 SQL数据库不需要在视图定义中支持ORDER BY。

换句话说,ORDER BY用于向用户呈现最终数据。

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

在某些特殊情况下,ORDER BY可以使用subquery。例如,在支持TOPLIMIT的数据库中,您可以使用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排序