2012-01-13 41 views
0

我創建一個選擇查詢與三個表的聯合.... 這樣與列標識符

select a as A,b as B c as C where c = x union 
select b as A,d as B e as C where e = y and d = a union 
select f as A,g as B,h as C 

和查詢的結果SQL視圖是這樣的:

A B C 
=========== 
1 abc ... 
55 def ... 
1 sas ... 

所以我希望有一個列可以計算行數,只是爲了防止重複標識符。 財產以後這樣

Row A B C 
================ 
1 1 abc ... 
2 55 def ... 
3 1 sas ... 

....

我的問題是如何能夠做到?

+2

看看'ROW_NUMBER()'在2008 – JonH 2012-01-13 21:20:12

+0

我嘗試過,但我還沒有看到它在工會上工作 – jcvegan 2012-01-13 21:21:21

+0

你關心你獲得行的順序是什麼?如果「行」是一個整數,從1開始並運行到行數,您是否關心?如果沒有,還有'NEWID()',這可能更容易在這裏使用。 – hvd 2012-01-13 21:22:59

回答

3
CREATE VIEW dbo.vname 
AS 
    SELECT [Row] = ROW_NUMBER() OVER (ORDER BY A), A, B, C FROM 
    (<UNION query here>) AS x; 

更換爲了通過與任何命令你」喜歡看到應用。請注意,您需要在外部查詢中針對dbo.viewname使用ORDER BY來確保Row將按照該順序出現。

+0

嘿,這工作很好。謝謝! – jcvegan 2012-01-13 21:35:33

5

您可以使用ROW_NUMBER()這樣的:

SELECT ROW_NUMBER() OVER (ORDER BY A,B,C) AS RowNo, * 
FROM 
(
select a as A,b as B c as C where c = x 
union 
select b as A,d as B e as C where e = y and d = a 
union 
select f as A,g as B,h as C 
) x 
1

您可以使用公用表表達式來實現這一目標:

WITH unionTable 
AS 
(
    select a as A, b as B, c as C where c = x union 
    select b as A, d as B, e as C where e = y and d = a union 
    select f as A, g as B, h as C 
) 
SELECT ROW_NUMBER() OVER (ORDER BY A) AS RowNumber, * 
FROM unionTable