これは私の見解です:
Create View [MyView] as
(
Select col1, col2, col3 From Table1
UnionAll
Select col1, col2, col3 From Table2
)
Id
という名前の新しい列を追加する必要があり、この列を一意にする必要があるため、新しい列をIDとして追加すると思います。このビューが大量のデータを返したので、パフォーマンスの良い方法が必要であることを言及する必要があります。また、ユニオンで2つの選択クエリを使用します。
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
ビューは、データ自体を含まない格納されたクエリであり、安定した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)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
)