2013-06-27 22 views
6

我有一個簡單的連接表在SQL Server中的兩段ID列。 有什麼辦法來選擇他們插入的確切順序的所有行?的準確順序返回行它們插入

如果我嘗試創建一個SELECT *,即使我沒有指定ORDER BY子句,這些行也不會按照它們插入的順序返回,而是按第一個鍵列排序。

我知道這是一個奇怪的問題,但是這個表非常大,我需要檢查一個奇怪的行爲何時開始,不幸的是我沒有在我的表中的時間戳列。

更新#1

我會盡力解釋爲什麼我說,行不「自然」爲了當我選擇沒有ORDER BY子句返回* FROM表。

我的表是這樣的:

id1  id2 
--------------- 
    1  1 
    2  2 
    3  3 
    4  4 
    5  5 
    5  6 

... and so on, with about 90.000+ rows 

現在,我不知道爲什麼(可能是軟件錯誤插入這些行),但我的表有450萬行,看起來像這樣:

id1  id2 
--------------- 
1  1 
1  35986 
1  44775 
1  60816 
1  62998 
1  67514 
1  67517 
1  67701 
1  67837 
... 
1  75657 (100+ "strange" rows) 

2  2 
2  35986 
2  44775 
2  60816 
2  62998 
2  67514 
2  67517 
2  67701 
2  67837 
... 
2  75657 (100+ "strange" rows) 

瘋了,我的表,現在有上百萬行的。當發生這種情況時(插入行時),我必須看一看,因爲我必須刪除它們,但是我不能僅僅使用* WHERE id2 IN(strange_ids)*來刪除,因爲有「right」id1列屬於這些id2列,我無法刪除它們,所以我試圖查看這些行是否被插入以刪除它們。

當我SELECT * FROM表時,它返回我按id1排序,如上表所示,並且 行未按此順序插入到我的表中。我覺得我的表沒有被損壞,因爲是這個奇怪的現象發生了同樣的方式,第二次,但現在我有,我可以手動刪除,就像是在1日的時間這麼多行。爲什麼這些行不按照它們插入的順序返回?這些「怪行」昨天definetely插入,如果我做一個SELECT *沒有ORDER BY應該返回靠近我表的末尾,是不是?

+3

您的ID列是否自動增量? – Bohemian

+0

不,它們只是兩個外鍵 – stefanobaldo

+0

您將不得不試圖找到某種方式將數據鏈接到另一個有時間戳的表,或者瞭解行爲何時開始表現自己。 – Tim

回答

5

由於其他人已經寫過,您將無法按照插入的順序從鏈接表中獲取行。

如果有一個或兩個,該鏈接表是加入表的某種行的內部排序的,那麼你可以用它來揣摩已創建的鏈接錶行時。基本上,它們不能創建之前兩個包含PK:s的行已被創建。

但是另一方面,您將無法找出創建後多久。

如果您有不錯的備份,可以嘗試恢復一個或幾個不同年齡的備份,然後嘗試查看這些備份是否也包含此奇怪行爲。它可以給你至少一些關於什麼時候開始奇怪的線索。

但是,底線是隻使用select,現在有辦法按照它們插入的順序從這樣的表中取出行。

5

如果SELECT *沒有以「自然」順序返回它們,並且沒有用時間戳或自動遞增ID插入它們,那麼我相信你會被擊沉。如果您有一個IDENTITY字段,請按此順序。 但問題我已經是,你怎麼能告訴SELECT *是不是在他們被插入的順序退呢?

更新: 根據您的更新,它看起來像沒有方法可以根據您的意願返回記錄,我猜你在ID1上有聚簇索引?

12

A select查詢沒有order by確實不是以任何特定順序檢索行。您必須有一個order by才能獲得訂單。

SQL Server沒有任何默認方法通過插入順序進行檢索。你可以做到這一點,如果你有行中的信息。最好的辦法是主鍵標識列:作爲每一行被插入

TableId int identity(1, 1) not null primary key 

這樣的柱遞增。

你也可以有一個CreatedAt柱:

CreatedAt datetime default getdate() 

然而,這可能對同時插入重複。

但是,關鍵點是select沒有order by子句返回無序的一組行。

+1

我們稱之爲確定性與非確定性 –

3
Select *, %%physloc%% as pl from table 
order by pl desc 
+3

單獨一個代碼塊並不能提供很好的答案。請添加解釋。 –

相關問題