2017-08-11 39 views
0

我有一個表中有SQL數據庫中的ShipCountry,ShipCity和Freight列。我試圖通過使用下面的查詢從該表中檢索數據。獲取數據庫順序中的數據,而無需對其進行排序

Select ShipCountry from CountryDetails Group by ShipCountry 

如果我運行這個查詢,我得到的結果按升序排列。而不是我需要數據庫順序的數據。如何通過SQL查詢來實現這一點?

說明:如果我運行下面的查詢,它將以數據庫順序返回數據。當我在查詢中添加group by子句時,我獲取了排序數據。

Select ShipCountry from CountryDetails 
+0

你好。你的問題有點不清楚。您能否介紹一個虛構的數據集以及您想成爲查詢結果的內容?謝謝 – Christos

+5

只是一個說明,沒有「數據庫順序」的真正概念。這僅僅是數據庫從內存/磁盤加載行的順序。這可以隨着時間的推移,在數據庫重啓之間發生變化等。 – wmorrell

+0

感謝您的回覆。在這裏,我提到的數據庫順序是數據存儲或輸入表中的順序。從您的觀點來看,數據庫重新啓動後,數據庫順序會隨時間而改變。 –

回答

6

由排序是不正確的。該應用組(組通過對聚合函數爲最小值,最大值或計數)

如果你需要一個特定的順序使用order by代替

Select ShipCountry from CountryDetails Order by ShipCountry 

否則,如果要的不是訂單使用簡單

Select ShipCountry from CountryDetails 

記住次在db中存儲的值沒有正確的順序..並且按照用於取回數據的順序選擇。

每次你需要你必須esplicitally通過

爲避免「重複值」使用順序..例如通過使用不同的,而不是集團的訂單時間:

Select distinct ShipCountry from CountryDetails 
+0

謝謝。我不想點菜。我只使用下面的查詢。 從CountryDetails中選擇ShipCountry 如果我運行它,它將返回多餘的ShipCountry值。爲了避免冗餘值,我在查詢中添加了group by子句。 我的目標是,我不想像asc或desc這樣的訂單,我不想要冗餘數據。 –

+2

@UmapathyS只要您意識到由於數據分佈的變化,數據庫順序在任何給定時間都會發生變化。這意味着結果集的排序順序可能會從一天變爲另一天。如果這是你可以忍受的事情,通過一切手段只需使用'SELECT FROM'。 – SchmitzIT

+0

@SchmitzIT感謝您的回覆。 –

0

,如果你想擁有同樣的數據庫順序在大多數情況下,如果你已經按主鍵排序,它將是相同的沒有按照你說的順序:

這裏的id是主鍵,如果你不能使用主鍵添加標識列並使用它:

ID名稱

1伊麗

2艾哈邁德

3約瑟夫

4奧馬爾

+0

如果只有每張桌子都有PK。在野外太多次了,一張桌子只是一堆,這要感謝非數據庫精明的開發者:( – SchmitzIT

+0

歡迎(「我明白你說的是:(」),每個表只有一個PK,而身份不是PK, PK可能是一個身份,PK可能是文本,在文本的情況下,所需的命令將不可用,因此,通過添加一個新的數字標識列,可以提供想要的命令 –

2

正如已經已經指出,你所描述可能導致來回您的最終意外的結果用戶。

我們假設你有一個沒有任何索引或鍵的表(一個所謂的堆)。一堆可以比作電話簿(是的,我已經有一段時間了)由數百頁組成,其中信息是隨機排列的。一堆就是這樣;很多隨機排序的數據。無論何時從這樣的表中查詢,查詢分析器都將盡其最大努力來確定傳遞數據的最快方式。

查詢分析器的這種決策是由統計指導的;一組關於數據及其分佈的度量標準。 SQL Server使用這些統計數據來計算基數(值的唯一性),並因此選擇返回數據的最快方式。

當您只是在堆上發出SELECT * FROM myTable時,這些統計信息將決定您的數據返回的順序。但是,這也意味着隨着時間的推移,隨着更多數據流入表格,統計信息將發生變化。這樣做的效果是,今天數據的排序順序不一定是明天返回數據的排序順序,或者從現在起甚至五分鐘。

如果您的最終用戶無妨,那麼SELECT * FROM myTable是適合您的解決方案。但是,如果您絕對需要以特定順序返回數據,則應始終使用ORDER BY子句。

相關問題