複数のテーブルからデータをSQL挿入
-
22-09-2019 - |
質問
私は4つのテーブルがあります。メッセージは、MessageCategory、MessageStatusとMessageLevelを
アイデンティティ(主キー)、コードと説明:MessageCategory、MessageStatusとMessageLevelは、すべてのちょうど3つのフィールドがあります。メッセージは、これらの三つのフィールドを参照し、アイデンティティ(主キー)MessageTextと注文を含む他のいくつかのデータフィールドを、持っています。アイデンティティ・フィールドは、自動インクリメントフィールドです。
私は今、すべての4つのテーブルにいくつかのデフォルトのデータを追加するSQLスクリプトを記述する必要があります。問題は、私は、このスクリプトを実行します顧客に送信されるスクリプトを作成する必要があり、です。私は、全体の更新を行うにはもう少しインテリジェントなコードを書くことはできません。 3つのテーブルは、単純なINSERT文している間、それは私にいくつかの追加の頭痛の原因となるメッセージテーブルです。
私は任意のインデックスを削除することはできませんし、私はそれが主キーのための1でカウントを開始すると仮定することはできません。
だから、例として、彼女はいくつかのデータです。
INSERT INTO MessageCategory (Code) Values ('Cat01');
INSERT INTO MessageStatus (Code) Values ('Status01');
INSERT INTO MessageLevel (Code) Values ('Level01');
そして、このようなものが必要になり、メッセージます:
INSERT INTO Messages(Category, Status, Level, MessageText, Order)
VALUES(
(SELECT Identity from MessageCategory where Code='Cat01'),
(SELECT Identity from MessageStatus where Code='Status01'),
(SELECT Identity from MessageLevel where Code='Level01'),
'Just some message',
1
);
それは動作しません、しかし。だから、この作業を取得するためのトリックは何ですか? (...読みすぎてコードを維持)
残念ながら、私は他のデータベースにアクセスすることはできません。私はそれをテストすることができますが、それは仕事に思えるたら、それはの問題だ...
送信-と祈る - それは、動作します解決
INSERT INTO Messages
(Category, Status, Level, MessageText, [Order])
SELECT
(SELECT TOP 1 [Identity] from MessageCategory where Code='Cat01') AS Category,
(SELECT TOP 1 [Identity] from MessageStatus where Code='Status01') AS Status,
(SELECT TOP 1 [Identity] from MessageLevel where Code='Level01') AS Level,
(SELECT 'Just some message') AS MessageText,
(SELECT 1) AS [Order]
上記は、SQL Serverのために働くだろう。 Identity
とOrder
両方がT-SQLのキーワードを予約されており、列名のために使用すべきではないことに注意してください。また、そのサブクエリが、私はTOP 1
文が含まれていることを保証するために、仕事に、このために複数の行を返さない必要があります。
ノートに次のことは、カラムのエイリアス(AS Category
など)は厳密には必要ではないということです。その順序は数えるものです。私は、SELECTリストが長くなる場合は特に、読みやすさのためにそれらが含まれるであろう。
他のヒント
それは、単一のスクリプトだ場合は、変数に自分のIDを格納します:
declare MessageCategoryID int;
declare MessageStatusID int;
declare MessageLevel int;
INSERT INTO MessageCategory (Code) Values ('Cat01');
set @MessageCategoryID=scope_identity();
INSERT INTO MessageStatus (Code) Values ('Status01');
set @MessageStatudID=scope_identity();
INSERT INTO MessageLevel (Code) Values ('Level01');
set @MessageLevelID=scope_identity();
INSERT INTO Messages(Category, Status, Level, MessageText, Order)
VALUES(
@MessageCAtegoryID,
@MessageStatusID,
@MessageLevelID,
'Just some message',
1);