这是我的看法:
Create View [MyView] as
(
Select col1, col2, col3 From Table1
UnionAll
Select col1, col2, col3 From Table2
)
我需要添加一个名为的新列Id
,并且我需要此列是唯一的,所以我想添加新列作为标识。我必须提到这个视图返回了大量数据,所以我需要一种性能良好的方法,而且我使用两个选择查询和联合所有我认为这可能有些复杂所以你的建议是什么?
这是我的看法:
Create View [MyView] as
(
Select col1, col2, col3 From Table1
UnionAll
Select col1, col2, col3 From Table2
)
我需要添加一个名为的新列Id
,并且我需要此列是唯一的,所以我想添加新列作为标识。我必须提到这个视图返回了大量数据,所以我需要一种性能良好的方法,而且我使用两个选择查询和联合所有我认为这可能有些复杂所以你的建议是什么?
使用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
该视图只是一个不包含数据本身的存储查询,因此您可以添加一个稳定的 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
)
除非满足以下条件,否则无法保证使用 ROW_NUMBER() 的查询返回的行在每次执行时的顺序完全相同:
这里有一个次要问题,这是一种观点。Order By 并不总是在视图中工作(长期的 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
)
使用“row_number() over (order by col1) 作为 ID”非常昂贵。这种方式在成本上效率更高:
Create View [MyView] as
(
Select ID = isnull(cast(newid() as varchar(40)), '')
, col1
, col2
, col3
From Table1
UnionAll
Select ID = isnull(cast(newid() as varchar(40)), '')
, col1
, col2
, col3
From Table2
)
将 ROW_NUMBER() 与“order by (select null)”一起使用,这将更便宜,并且会得到你的结果。
Create View [MyView] as
SELECT ROW_NUMBER() over (order by (select null)) as id, *
FROM(
Select col1, col2, col3 From Table1
Union All
Select col1, col2, col3 From Table2 ) R
GO