[解決済み] SQL Serverです。2つのテーブルに同時に挿入することは可能ですか?
質問
私のデータベースには、以下の3つのテーブルがあります。
Object_Table
,
Data_Table
と
Link_Table
. リンクテーブルには、オブジェクトレコードのIDとデータレコードのIDという2つのカラムがあるだけです。
からデータをコピーしたい。
DATA_TABLE
に対応するレコードを挿入します。
Data_Table
と
Link_Table
を別の与えられたオブジェクトの ID で使用することができます。
I できる テーブル変数に選択し、各反復で2つの挿入を行うループによってこれを行う。
この方法が一番いいのでしょうか?
編集 : ループを避けたい理由は2つあります。1つは、私は怠け者なので、ループ/テンプ・テーブルを使うとコードが多くなり、コードが多くなるとミスをする場所が増えるということ、もう1つはパフォーマンスに対する懸念です。
一度の挿入ですべてのデータをコピーできますが、各レコードが新しいIDを持つ新しいデータレコードにリンクするために、リンクテーブルをどのように取得しますか?
解決方法は?
以下は、私が持っていた状況を、テーブル変数を用いて設定したものです。
DECLARE @Object_Table TABLE
(
Id INT NOT NULL PRIMARY KEY
)
DECLARE @Link_Table TABLE
(
ObjectId INT NOT NULL,
DataId INT NOT NULL
)
DECLARE @Data_Table TABLE
(
Id INT NOT NULL Identity(1,1),
Data VARCHAR(50) NOT NULL
)
-- create two objects '1' and '2'
INSERT INTO @Object_Table (Id) VALUES (1)
INSERT INTO @Object_Table (Id) VALUES (2)
-- create some data
INSERT INTO @Data_Table (Data) VALUES ('Data One')
INSERT INTO @Data_Table (Data) VALUES ('Data Two')
-- link all data to first object
INSERT INTO @Link_Table (ObjectId, DataId)
SELECT Objects.Id, Data.Id
FROM @Object_Table AS Objects, @Data_Table AS Data
WHERE Objects.Id = 1
おかげさまで 回答 OUTPUT句を指摘してくれたので、解決策を示すことができます。
-- now I want to copy the data from from object 1 to object 2 without looping
INSERT INTO @Data_Table (Data)
OUTPUT 2, INSERTED.Id INTO @Link_Table (ObjectId, DataId)
SELECT Data.Data
FROM @Data_Table AS Data INNER JOIN @Link_Table AS Link ON Data.Id = Link.DataId
INNER JOIN @Object_Table AS Objects ON Link.ObjectId = Objects.Id
WHERE Objects.Id = 1
しかし、次のようなエラーが発生するため、現実にはそれほど単純ではないことがわかりました。
OUTPUT INTO 句は、以下のような場合には使用できません。 のどちらか一方が(主キー、外部キー キー)の関係
私はまだ
OUTPUT INTO
を作成し、その後、通常の挿入で終了します。そのため、ループを回避することはできますが、テンポラリテーブルを回避することはできません。
関連
-
org.postgresql.util.PSQLException: ERROR: リレーション "userinfo" の列 "loginid" が存在しません。
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] データベース内の全テーブルのサイズを取得する
-
[解決済み] MySQLで'insert if not exists'を行うにはどうしたらいいですか?
-
[解決済み] postgres: ユーザーをスーパーユーザーにアップグレードしますか?
-
[解決済み] SQL ServerにおけるINSERT OR UPDATEに関する解決策
-
[解決済み] SQLite - UPSERT *not* INSERT or REPLACE
-
[解決済み] SQL ServerでINSERT INTOとしてデータをエクスポートする
-
[解決済み] T-SQLでテーブル変数をSELECT INTOする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SQLラーニングノート--オペランドには1つのカラムが必要です。
-
解決策:ユーザー root で localhost:3306 にある MySQL に接続できませんでした。
-
[解決済み] アドホッククエリとは何ですか?
-
[解決済み] SQL Server : 列を行に変換する
-
[解決済み] JOINとINNER JOINの違いについて
-
[解決済み] PostgreSQLからのPL/pgSQL出力をCSVファイルに保存する
-
[解決済み] SQL JOIN - WHERE句とON句の比較
-
[解決済み] SQL Server の VARCHAR/NVARCHAR 文字列に改行を挿入する方法
-
[解決済み] ある列の最大値を持つ行を取得する
-
[解決済み] SQL Server の CASE ステートメントで OR がサポートされていない。