15

这是我的看法:

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

我需要添加一个名为的新列Id,并且我需要此列是唯一的,所以我想添加新列作为标识。我必须提到这个视图返回了大量数据,所以我需要一种性能良好的方法,而且我使用两个选择查询和联合所有我认为这可能有些复杂所以你的建议是什么?

4

5 回答 5

31

使用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
于 2012-04-30T10:42:19.423 回答
3

该视图只是一个不包含数据本身的存储查询,因此您可以添加一个稳定的 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
)
于 2012-04-30T10:45:05.830 回答
2

除非满足以下条件,否则无法保证使用 ROW_NUMBER() 的查询返回的行在每次执行时的顺序完全相同:

  1. 分区列的值是唯一的。[分区是父子,好像一个老板有3个员工][忽略]
  2. ORDER BY 列的值是唯一的。[如果第 1 列是唯一的,row_number 应该是稳定的]
  3. 分区列和 ORDER BY 列的值组合是唯一的。[如果您需要按顺序排列 10 列来获得唯一性...去使 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
)
于 2013-03-14T04:19:23.533 回答
1

使用“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
)
于 2019-04-02T08:51:12.443 回答
1

将 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
于 2020-10-21T12:52:59.593 回答