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. ちなみに、同じことがビューにも当てはまります。データベースは、ビュー定義で ORDER BY をサポートするSQL必要はありません。

つまり、ORDER BY最終データをユーザーに提示するためのものです。

これを理解する最善の方法は、ストレージの異なるパーティション間でテーブルを分割できることを認識することです ( table spaces)。tableユーザーは a を「ファイル」と考える傾向がありますが、複数のファイルに格納することができます (多くの場合そうです)。複数のファイルのレコード間に固有の順序はありません。

特殊なケースでは、ORDER BYで使用できますsubquery。たとえば、TOPまたはをサポートするデータベースでLIMITは、order by を使用して取得する特定の行を指定できます。これは頭​​に浮かぶ唯一の例外ですが、他にもあるかもしれません。

いずれにせよ、解決策は、query他の回答が提案しているように、順序をアウターに置くことです。

于 2012-08-03T13:21:23.300 に答える
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 に答える
0

このようにしてみてください

select * from Customers, (select Customers.Id, Row_Number() OVER(ORDER BY count(Opportunities.Id) desc) as row_num from customers 内部で、customers.id=opportunities.customerid の機会に参加します。機会.customerId, Customers.Id でグループ化します) as test where Customers.ID=test.Id order by test.row_num

于 2012-08-03T13:13:52.883 に答える