web-dev-qa-db-ja.com

SELECT INTOを使用して新しいテーブルを作成し、主キーを追加する

SELECT INTO SQL構文を使用して作成されたデータベーステーブルがあります。データベースはAccessにあり、約500,000行で構成されています。問題は、私が結合を行うとき、一意は行全体です-私が欲しいのは、主キーとしての自動番号IDフィールドです。

私が現在持っているコードは次のようなものです:

SELECT INTO new_table
FROM 
(SELECT * FROM table a, table b WHERE a.name = b.name)

SELECT INTOクエリに句を追加して、主キーを追加してテーブルを1回のパスで作成できるようにしたいと思っていましたが、これは可能ですか?

そうでない場合、SQLのみを使用してこれを行う最良の方法は何ですか?

13
user559142

_Primary Key_ステートメント中に_INSERT INTO_を追加することは、私が知る限りでは不可能です。ただし、SQL Serverの IDENTITY() 関数を使用して自動インクリメントするIDENTITY列を追加することができます。

このようなもの:

_SELECT 
    ID = IDENTITY(INT, 1, 1),
    col1,
    col2
INTO new_table 
FROM (SELECT * FROM table a, table b WHERE a.name = b.name)
_
15
JodyT

Accessでは、1つのステートメントで目的を達成できるとは思いません。あなたがする必要があると思うのは...

  1. 質問の説明に従って、新しいテーブルを作成します。

  2. 次のようにオートナンバー列を追加します。

    ALTER TABLE [new_table] ADD COLUMN [ID] AUTOINCREMENT NOT NULL

  3. 主キーを追加した列を作成します。

    ALTER TABLE [new_table] ADD CONSTRAINT NewTable_PK PRIMARY KEY(ID)

6
Gord Thompson

主キーを作成し、同時に挿入する必要性は何ですか?

主キーとテーブルを同時に作成できますが、私の知識では挿入できません。あなたはこれを行うことができます。

create table Tester 
(
Id int identity
    constraint PK_Id primary key(Id),
    description varchar(256)
)


insert into Tester
Select description
from table

または、テーブルがまだ存在していないことを確認し、このスクリプトをまとめて実行する場合は、ドロップを追加して作成します。一時テーブル '#(something)'は、コードレベルの移動とその後のクリーンアップに使用する場合を除いて、永続テーブルの多くのルールに従うことができます。

if object_id('(schema).(tablename)') is not null 
   drop table (schema).(tablename)

私は「アイデンティティー」を使って増え続ける種を作りました。デフォルトは1から始まり、1ずつ増加します。これは、必要な単純なデータベースの主キーの95%に対応します。自動的にインクリメントされるので、心配する必要はありません。次のようなものがある場合は、特定の値だけに挿入することもできます。

insert into table (col1, col2)

これにより、すべてを挿入して必要な列にするだけで済みます。

0
djangojazz

SQL 2012以降、DateFromParts関数があります。これはもう少し読みやすいと思います。

DATEFROMPARTS(YEAR(<datefield>), MONTH(s.DateEnded), 1)
0
Drew Miller