2012-08-03 66 views
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的計數的順序返回customes ID。

我上面的查詢給出一個子查詢到另一個查詢AS-

select * from Customers where Id in (above query) 

但我的最終查詢沒有返回的順序相同的結果。它正在改變我的結果順序,以升序。

如何保持與內部查詢/子查詢相同的記錄排序?

+0

如果你沒有指定sql引擎的順序,它可以自由地對它認爲合適的任何方式進行排序(或不排序)。即使看起來你沒有'order by'也能獲得一致的順序,這是一種錯覺,並且可以在你正在使用的新版本或修訂版本的sql引擎中進行更改。 – 2012-08-03 13:08:19

回答

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在外部查詢

+0

要小心,Customers.ID可以在您的查詢中複製,但不在OP requeriment中。 – danihp 2012-08-03 13:07:55

+0

我寫了相同的查詢。但是現在我想要選擇客戶表的所有列。所以我把它作爲一個子查詢。但它沒有給我實際的結果順序 – Priyanka 2012-08-03 13:11:59

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

+1

爲什麼你把計數放在括號內?首先你應該要求數據庫品牌;)可能是'for MySql「,對於oracle等等。 – danihp 2012-08-03 13:09:23

0

嘗試這樣

SELECT * FROM客戶, (選擇 Customers.Id, ROW_NUMBER()OVER(ORDER BY計數(Opportunities.Id)DESC)作爲ROW_NUM 從 客戶 內對customers.id = opportunities.customerid 加盟機會 通過 opportunities.customerId, Customers.Id)作爲試驗 基團,其中Customers.ID = test.Id 爲了通過test.row_num

1

SQL,表格是無序的。子查詢的結果被視爲表格;因此它們是無序的。當子查詢顯式地具有ORDER BY時,這甚至是真的,也許與直覺相反。順便說一句,對於觀點也是如此。 A SQL數據庫不需要在視圖定義中支持ORDER BY。

換句話說,ORDER BY用於向用戶呈現最終數據。

我發現理解這一點的最好方法是意識到表可以分成不同的存儲分區(table spaces)。儘管用戶傾向於認爲table是「文件」,但它可以(並且經常)存儲在多個文件中。多個文件上的記錄之間沒有固有的順序。

在一些特殊情況下,ORDER BY可用於subquery。例如,在支持TOPLIMIT的數據庫中,可以使用order by來指定您獲得的特定行。這是唯一想到的例外,但也可能有其他例外。

在任何情況下,解決方案是將訂單放在外部query上,如同其他答案提出的那樣。