2014-09-06 56 views
4

每行可以說我有這樣的一個表:分配ID在Microsoft SQL Server視圖

create table MyTable (
Myname varchar (10) primary key not null 

) 和數據等幾行:

insert into MyTable values ('john'); 
insert into MyTable values ('Brad'); 
insert into MyTable values ('James'); 
insert into MyTable values ('Anna'); 
insert into MyTable values ('Eric'); 
insert into MyTable values ('Hossein'); 

我想創建該分配ID到各行的圖, 我已經使用下面的選擇語句:

select rank() OVER (ORDER BY Myname) as ID, MyTable.Myname 
    from MyTable 
    order by ID 

個結果是完全可以接受的,但問題出來的時候我嘗試創建視圖

create view myview as 
select rank() OVER (ORDER BY Myname) as ID, MyTable.Myname 
    from MyTable 
    order by ID 

我的問題是:

1 - 我怎麼可以創建一個從上面提到的select語句的看法?

2-有沒有其他方法可以使用?

+0

你的查詢有什麼問題,除了你在視圖中使用'order by'而沒有'top'? – 2014-09-06 14:19:02

+1

非常感謝你的真棒答案。 通過刪除ID編號它仍然是工作。 – 2014-09-06 14:28:46

+0

@HoseinDjadidi Gordon的答案比我的回答更好地解決了您的具體問題。如果你接受他的回答,我可以刪除我的。 – Donal 2014-09-06 14:33:43

回答

2

order by在視圖中是不允許的,除非您使用top。由於每documentation

視圖定義中的SELECT子句不能包括以下內容:

  • ORDER BY子句,除非有也是在SELECT語句
  • 的選擇列表中的TOP子句

所以,你的說法是不罰款的order by

create view myview as 
    select rank() OVER (ORDER BY Myname) as ID, MyTable.Myname 
    from MyTable ; 

即使您將order bytop一起使用,結果也無法以特定順序保證。您只能保證通過使用order by外部查詢。

+1

實際數據集退出時間很長,它基於日期(近15000行數據)排序,是否有可能分配給每個視圖的ID變得無序? 謝謝。 – 2014-09-06 14:42:12

+0

(1)15,000行不大。 (2)等級由數據庫定義並在每次運行時重新計算,因此不能「失序」。結果數據集可能不會按順序返回,但排名將被正確分配。 – 2014-09-06 14:46:54