2012-06-11 37 views
0

我有一個數據類型爲Varchar(MAX)的表變量。從表變量中選擇的數據與插入的順序不同?

我首先插入值'header',然後基於內部連接,接下來將'Details'插入到同一個表變量中。最後,我插入「預告片」。

我得到的輸出順序是:「標題」,然後是「預告片」,最後是「細節」。

我所需的輸出是按以下順序:

Header 
Detail 
Trailer 

但我得到這個順序:

Header 
Trailer 
Detail 

注:我不能夠使用ASC /遞減的選擇。我按照我需要的順序插入。

回答

2

SQL數據庫實際上並不瞭解您按照什麼順序放入或按給定順序存儲數據。您可能需要在表中使用值的第二列,以便保留您所需的任何順序。

想想這件事就好像把東西交給你的朋友來保存 - 她以後會把它全部給你,但她同時將它存儲在某個地方。當你不想爲其他東西騰出空間時,她可能會移動它,或者可能會按照您給予她的順序將它交回,但是您沒有告訴她要保持順序,所以她沒有。

數據庫需要能夠在後臺移動東西,因此它們的構建方式本質上並不瞭解任何順序 - 當您將它提供給數據庫時,您需要知道順序,以便可以將它會按照您稍後想要的順序恢復。 order子句允許SQL對數據施加一個順序,但它不記住或自己擁有一個順序。

+0

你也可以把這些不同的東西(Header,Trailer,Detail)放在不同的列中,這可能會更有意義。看起來,數據存儲在標題,細節等不一定是相同的 - 那麼爲什麼不以一種更有意義的方式堅持它。這當然取決於我們不知道的事情。 –

+1

另一種思考你的比喻的方式 - 把你的朋友一疊1美元的鈔票交給你的朋友,然後她把它放在地板上。現在請她把他們拿回來,然後按照你給予她的順序把它們還給你。如果你的原始訂單是通過序列號,她可能會這樣做,她有一些時間殺死... –

6

如果您在外部查詢中不包含ORDER BY,請不要期望SQL Server讀取您的想法。不能保證SQL Server將按照插入的順序返回數據。你應該添加一個列到你的表變量[rank]什麼的。插入標題時,插入1,查看詳細信息行,插入2,然後插入標題插入3.現在,您可以將ORDER BY [rank];添加到查詢的末尾,獲得可預測的結果,並且每個人都很開心。

+0

但是插入順序將在輸出中出現。不是嗎? – jesvin

+3

不,你想插入表格就像插入一個平面文件;不是。如果您不提供訂單,SQL Server將按照它認爲最有效的順序返回行。 *有時*會匹配插入的順序,但不總是。 –

+1

@jesvin - 只有在您的語句中添加ORDER BY'子句時,如果不添加存儲它的一列,則不會有*插入順序* – Lamak

相關問題