web-dev-qa-db-ja.com

SQL Server 2008のビューにID列を追加する

これは私の見解です:

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

Idという名前の新しい列を追加する必要があり、この列を一意にする必要があるため、新しい列をIDとして追加すると思います。このビューが大量のデータを返したので、パフォーマンスの良い方法が必要であることを言及する必要があります。また、ユニオンで2つの選択クエリを使用します。

14
Saeid

SQL Server 2008ではROW_NUMBER()関数を使用します。

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
25
Daniel P

ビューは、データ自体を含まない格納されたクエリであり、安定した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
)
3
Diego

次の条件が当てはまらない限り、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
)
2
Rich

「row_number()over(order by col1)as 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
)
0
klingu