2010-11-09 58 views
1

如果我創建一個視圖並按照我希望「接收」它們的順序選擇我的字段,我可以完全確信我可以從我的應用程序中調用「從myView中選擇*」,而不是再次指定所有字段名我的選擇查詢?我可以依靠sql視圖中的字段順序嗎?

我問這個,因爲我將整個數據行傳遞給我的DataModel,並通過將屬性分配給連接到此數據行的itemarray中的不同索引來構造對象。如果這些字段出現亂碼,我就不知道我的對象會發生什麼。

我知道我不能依賴於一個視圖內部的命令(在此之前被燒過)。但我不確定的領域順序。

對不起,如果這是sql noob級別。我們都從這個地方開始。現在,我的應用程序代碼中的所有無關字段名稱都使可讀性有點困難,所以如果我可以安全地返回並用*替換很多語法,那麼這將非常棒。

這些表格很小,所以我不擔心在單個字段上使用*的含義。我只是想不編碼不必要的語法。

+2

我通常會手動指定列名,除非我只是在SQL提示符下運行快速一次性查詢。它讓我知道(和SQL引擎知道)我的期望 - 也就是說,它增加了「契約」的明確性,並允許更快速地生成更有意義的錯誤。附加信息也可以用於修剪記錄大小,從而節省傳輸成本等。如果「可讀性」是一個問題,也許你還沒有解決一個舒適的可讀方式來編寫SQL,否則阻礙了你的方式環境希望你表達查詢。 – 2010-11-09 21:09:56

+0

+1 @pst - 優秀的答案。 – 2010-11-10 12:10:26

+0

我想也許我還沒有解決一個舒適的方式來寫我的SQL查詢。當查詢調用40個字段並跨越2行以上時,它很難在非寬屏顯示器上閱讀。在我的部門。我們保持「精益」的觀點,或者至少嘗試。視圖中只包含必要的內容。如果您需要更多的信息,那麼可能會有更多的數據(例如:每日統計數據與每小時統計數據)。這通常保持行#可接受,但有時會有一個荒謬的#字段。 – TWood 2010-11-10 15:31:30

回答

2

列順序可以不被保證的或可靠的,如果這兩個都爲真

  • 視圖定義已SELECT *SELECT tableA.*內部
  • 任何更改都向有關的表(多個)製成

您需要運行sp_refreshview:有關潛在問題,請參閱此question/answer

當然,如果在視圖中有簡單的SELECT * FROM table,爲什麼不直接使用表格並節省一些維護時間?

最後,我不得不說,這不是特別建議使用SELECT * ... :-)

+0

我的解釋並不是視圖被定義爲'select * from table',而是OP想要在他的代碼中使用'select * from view'。 – 2010-11-09 21:22:16

+0

@Joe Stefanelli:當然,但這是我的[寵物不喜歡](http://programmers.stackexchange.com/questions/14856/best-practices-that-you-disagree-with/14880#14880)當民間做這樣的事情啊。得到它。盡我所能,讓我的答案更加清晰。 – gbn 2010-11-09 21:24:33

+0

+1,特別是最後一句。 – 2010-11-10 12:06:18

1

是的,我一直依靠select *以視圖或表格中指定的順序返回字段。

例如Microsoft SQL - 「*指定從在FROM子句所有表和視圖的所有列應返回列由表或視圖返回,如在FROM子句中指定,並且在爲了在它們。存在於表格或視圖中。「

+0

但是,正如gbn所注意到的,如果表的結構發生變化,那麼'select *'返回的字段將會不同。 – 2010-11-10 12:07:51

+0

是的,在SQL選擇中使用星號同時是一個很大的好處和一個很大的詛咒。但問題作者明確表示他並不擔心這一點。 – RedGrittyBrick 2010-11-10 14:51:42

+0

並非如此--OP稱「這些表格很小,所以我不擔心在各個字段上使用*的含義」,這意味着額外的處理/帶寬成本不是問題。 – 2010-11-10 15:32:18

4

列順序是有保證的,行順序(如您所注)不是。

+0

因此...... ** NO **用於行順序:-)唯一的方法(一般情況下)*保證*行排序是在查詢的*頂級*處使用ORDER BY子句。 (ORDER BY在視圖中不被尊重,有些版本會拒絕它IIRC。) – 2010-11-09 21:07:11

+0

@pst:例如,SQL Server將在視圖中拒絕一個'ORDER BY',除非你還包含一個'TOP'。 – 2010-11-09 21:12:48

+0

值得注意的是,這是受到表格更改和sp_refreshview等? – gbn 2010-11-09 21:20:32

2

是,列的左到右的順序在SQL保證。事實上,它是用來證明SQL不是真正關係型的三個缺陷之一(例如,參見The Importance of Column Names by Hugh Darwen),重複的行和NULL的值是另外兩個。

+0

對於SQL而言,+1不是真正的關係型,但請參閱gbn對'select *'危險的回答。 – 2010-11-10 12:09:03

相關問題