2012-04-30 57 views
9

這是我的看法:標識列到一個視圖添加在SQL Server 2008中

Create View [MyView] as 
(
Select col1, col2, col3 From Table1 
UnionAll 
Select col1, col2, col3 From Table2 
) 

我需要添加一個新列名爲Id,我需要此列是唯一的,所以我想添加新列身份。我必須提到這個視圖返回了大量的數據,所以我需要一種性能良好的方式,而且我還使用了兩個select union查詢,我認爲這可能會有些複雜,所以您的建議是什麼?

+0

在SQL Server中的視圖僅僅是一個「存儲查詢」 - 它沒有數據庫中的任何物理表示。因此,你不能將一個標識列添加到視圖 –

+0

可以確定'id'不穩定(如果'Table1'增長,'Table2'的第一個'id'將與以前不同)? – Oded

+1

@ marc_s - OP有可能是絕對的在這裏尋找'ROW_NUMBER'類型的功能。 – Oded

回答

21

使用ROW_NUMBER()功能在SQL Server 2008中

Create View [MyView] as 

SELECT ROW_NUMBER() OVER(ORDER BY col1) AS id, col1, col2, col3 
FROM(
    Select col1, col2, col3 From Table1 
    Union All 
    Select col1, col2, col3 From Table2) AS MyResults 
GO 
+1

是的,但這不會提供穩定的ID。 – Oded

+1

如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)以精確地設置格式並進行語法突出顯示! –

+0

謝謝你。這對於在提交表之前在視圖中測試數據非常有用。在我的情況下,使用通配符就像這樣: SELECT ROW_NUMBER()OVER(ORDER BY col1)as ID,x。* FROM(SELECT blah blah blah)as x – user1003916

1

的觀點僅僅是不包含數據本身,所以你可以添加一個穩定的ID存儲查詢。如果您需要用於其他目的的ID像尋呼機例如,你可以這樣做:

create view MyView as 
(
    select row_number() over (order by col1) as ID, col1 from (
     Select col1 From Table1 
     Union All 
     Select col1 From Table2 
    ) a 
) 
+0

是的,但這不會提供穩定的ID。 – Oded

+0

是真實的,但他沒有說他需要一個。我假設他需要id作爲其他用途,如分頁,例如 – Diego

+1

我不喜歡假設。如果你確實假設,你應該發佈這些假設...... – Oded

1

不保證該行通過使用ROW_NUMBER(查詢返回)將精確排序,每個相同除非滿足以下條件:

  1. 分區列的值是唯一的。 [分區是親子,像老闆有3名員工] [忽略]
  2. ORDER BY列的值是唯一的。 [如果第1列是唯一的,row_number應該是穩定的]
  3. 分區列和ORDER BY列的值的組合是唯一的。 [如果您的訂單需要10列才能獲得唯一的...爲了使row_number穩定]「

這裏有一個次要問題,這是一個視圖。在視圖(長期SQL錯誤)工作忽略ROW_NUMBER()爲第二:

create view MyView as 
(
    select top 10000000 [or top 99.9999999 Percent] col1 
    from (
     Select col1 From Table1 
     Union All 
     Select col1 From Table2 
    ) a order by col1 
)