3

SQL Server 2012を使用していて、次の方法でテーブルを作成しています。

SELECT x, y
INTO CampRegistration
FROM tableA

UNION

SELECT x, y
FROM tableB

xとyは主キーではありません。CampRegistrationテーブルに、統合された代理主キーである追加の列があることを望みます。のようなものIDENTITY

SELECT INTO後で列を変更するか、追加してデータを入力することで、これを行うにはどうすればよいですか?

4

5 に答える 5

7

他の回答は行番号を追加しますが、それをキーにしないでください。また、新しい登録を追加する場合にも役立ちません。SELECT INTOを実行した後、IDENTITY列を追加して、それをキーにする方法は次のとおりです。

ALTER TABLE dbo.CampRegistration
  ADD RegistrationID INT IDENTITY(1,1);

ALTER TABLE dbo.CampRegistration 
  ADD CONSTRAINT PK_CampRegistration
  PRIMARY KEY (RegistrationID);
于 2013-01-10T15:32:48.697 に答える
4

IDENTITYこの関数を使用して、IDENTITYプロパティを持つ列を直接追加できます。

;WITH T
     AS (SELECT x,
                y
         FROM   tableA
         UNION
         SELECT x,
                y
         FROM   tableB)
SELECT IDENTITY(INT, 1, 1) AS Id,
       x,
       y
INTO   CampRegistration
FROM   T 

後でPK制約を追加する必要がありますが、ヒープがクラスター化インデックスに変換されるときに、不要な並べ替え操作が追加されます。最も効率的な方法はCREATEテーブルに行くことです

SELECT TOP (0) IDENTITY(INT, 1, 1) AS Id,
               x,
               y
INTO   CampRegistration
FROM   tableA 

次に、テーブルが空の状態で、クラスター化された主キーを追加します。

次に、テーブルに挿入します。SQL Serverは、IDENTITYがクラスター化インデックスの順序になることを認識し、それらをわざわざ並べ替えることはありません。

于 2013-01-10T16:43:32.360 に答える
3

ウィンドウ関数を使用して、その場で列を作成します。

SELECT Row_Number() Over (Order By x,y) As ID, x, y
INTO CampRegistration
FROM tableA
于 2013-01-10T15:23:03.880 に答える
3

UNIONを使用しているので、CTEまたはインラインビューのいずれかを使用する必要があります。

例えば

SELECT Row_Number() Over (order by x,y) rn, x,y
INTO CampRegistration
FROM
(
SELECT x, y
FROM tableA
UNION
SELECT x, y
FROM tableB
) as t
于 2013-01-10T15:27:52.387 に答える
2

使ってみませんかROW_NUMBER()

SELECT x, y, ROW_NUMBER()
INTO CampRegistration
....
于 2013-01-10T15:22:02.740 に答える