質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

3回答

8767閲覧

SQL Serverで 別テーブルからinsert文を作るには?

ykky

総合スコア13

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2016/02/16 03:39

編集2022/01/12 10:55

こんにちは、また皆様のお知恵をお貸しください。
宜しくお願いします。

SQL Serverで別テーブルからデータを引っ張ろうとしておりますが、
1:Nになってしまい、うまくクエリがかけません・・・。

A tableには
User_cd(PK),a_cdがあり、
B tableには
b_cd,(PK)c_cdがあります。

insertしたい項目はA.a_cdとB.b_cdの2項目です。

a_cdは1対で、b_cdは複数行ありますが、
Bテーブルにある全ての値を同じa_cdと一緒にinsertしたいのです。

一気にインサートする方法はありませんでしょうか?
お力添えをよろしくお願いいたします。

(1)
insert into TableA(USER_ID,sample_CD)
select USER_ID from TableB where USER_ID = 0001 union
select sample_cd from TableC

→メッセージ 120、レベル 15、状態 1、行 1
INSERT ステートメントの SELECT リストは INSERT リストよりも項目数が少なくなっています。SELECT の値の数は、INSERT 列の数と一致させてください。

(2)
insert into TableA(USER_ID,sample_CD)
select '0002', sample_cd from TableC
正常に処理されることはできました・・・。
最悪、これでもよいのですが、もっと良い方法を勉強もかねて教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sk_3122

2016/02/16 04:13

可能であれば、うまくいかなかった SQL を貼りつけてもらえると良いのですが。(エラーになっても良いので)
ykky

2016/02/16 04:29

2つ貼り付けました。宜しくお願い致します。
guest

回答3

0

情報を整理させてください。

追記前の質問では、

insertしたい項目はA.a_cdとB.b_cdの2項目です。

とありました。
INSERT先テーブルは不明で、AテーブルとBテーブルの項目を抽出した内容をINSERTしたいものと受け取っておりました。

これに対し、追記いただいたSQLは

insert into TableA(USER_ID,sample_CD)
select USER_ID from TableB where USER_ID = 0001 union
select sample_cd from TableC

となっております。

推測するに、当初のa.a_cd⇒TableB.USER_ID、b.b_cd⇒TableC.sample_cdで、
INSERT先:TableA(USER_ID,sample_CD)
抽出項目:TableB.USER_ID、TableC.sample_cd
という感じでしょうか?

いまいちど、使用するテーブル(INSERT先テーブル、抽出テーブル)の使用項目とプライマリキーを整理させてください。
※なんとなく、一意制約違反となるINSERTをしようとしている気がしておりまして。

あと抽出テーブルのデータサンプルと、期待するINSERT結果を提示いただけると求める回答が得られやすいと思います。

よろしくお願いいたします。

投稿2016/02/16 05:16

編集2016/02/16 05:19
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ykky

2016/02/16 06:16

ご回答ありがとうございます。 すみません、分かりづらくなってしまいました。 jawa様の仰るとおり、 >INSERT先:TableA(USER_ID,sample_cd ) >抽出項目:TableB.USER_ID、TableC.sample_cd  が正しいです。 TableAは、USER_ID,sample_cd (984501,01)どちらもPKとなっています。 TableBは、USER_IDのみPK(984501) TableCは、sample_cdのみPK(01)となっています。 以上が使用項目とPKです。 TableA データサンプル USER_ID|sample_cd 984501 | 01 984501 | 02 984501 | 03   .  | .   .  | .   .  | . 期待するInsert結果はこのようにしたいのです。 左項目にTableBのUSER_IDを、 右項目にTableAのsample_cdをInsertしたいと思っております。 宜しくお願い致します。
jawa

2016/02/16 07:42 編集

TableBとTableCの連結キーがないということは、 [TableB] USER_ID ---------- 984501 984502 [TableC] sample_cd ---------- 01 02 03 というときに [TableA] USER_ID|sample_cd ------------------ 984501 | 01 984501 | 02 984501 | 03 984502 | 01 984502 | 02 984502 | 03 という結果が欲しいということでよかったでしょうか? それであれば insert into TableA(USER_ID,sample_CD) select B.USER_ID,C.sample_cd from TableB B, TableC C のようなINSERT文でいけると思います。 BとCを結びつける条件があるのであれば、sk_3122さん提示のようにjoinしてあげる必要があります。
jawa

2016/02/17 00:43 編集

すみません、改めてSQLを見直してようやくやりたいことが理解できたようです。 >insert into TableA(USER_ID,sample_CD) > select USER_ID from TableB where USER_ID = 0001 union > select sample_cd from TableC TableBからはUSER_ID を指定して1行のみ取得し、TableCの全てのsample_cdと組み合わせてTableAに出力したいのですね。 ならば insert into TableA(USER_ID,sample_CD) select B.USER_ID,C.sample_cd from TableB B, TableC C where B.USER_ID = 0001 という感じで期待される動作になるかと思います。 お試しください。
guest

0

追記を受けて。
TableB と TableC の値を TableA に INSERT したいということですね。

sql

1insert into TableA(USER_ID,sample_CD) 2select USER_ID from TableB where USER_ID = 0001 3union 4select sample_cd from TableC

ひとまず、『SELECT の値の数は、INSERT 列の数と一致させてください。』のエラーが出ているのは、
USER_ID, sample_CD の 2 項目に値を入れようとしているのに
SELECT 文では 1列 しか値を返していないからですね。(2列返さないとエラーになる)

select USER_ID from TableB where USER_ID = 0001
union
select sample_cd from TableC

の部分だけ実行してみるとわかると思います。


質問に対する回答としては、TableB と TableC は、何か紐付くキーがあるのでしょうか。

TableB と TableC を紐付けない場合

sql

1-- ======================================== 2-- これはテストテーブル的なもの 3-- ======================================== 4WITH TableB AS ( 5 SELECT '0001' AS USER_ID UNION ALL 6 SELECT '0002' AS USER_ID UNION ALL 7 SELECT '0002' AS USER_ID 8), 9TableC AS ( 10 SELECT 'aaa' AS sample_cd UNION ALL 11 SELECT 'bbb' AS sample_cd UNION ALL 12 SELECT 'ccc' AS sample_cd 13) 14-- ======================================== 15-- SELECT ここから 16-- ======================================== 17SELECT DISTINCT b.USER_ID, c.sample_cd 18FROM TableB b, TableC c

TableB と TableC を紐付ける場合 (たとえばTableCにもUSER_IDがあってそれで紐付ける場合)

sql

1-- ======================================== 2-- これはテストテーブル的なもの 3-- ======================================== 4WITH TableB AS ( 5 SELECT '0001' AS USER_ID UNION ALL 6 SELECT '0002' AS USER_ID UNION ALL 7 SELECT '0002' AS USER_ID 8), 9TableC AS ( 10 SELECT '0001' AS USER_ID, 'aaa' AS sample_cd UNION ALL 11 SELECT '0002' AS USER_ID, 'bbb' AS sample_cd UNION ALL 12 SELECT '0002' AS USER_ID, 'ccc' AS sample_cd 13) 14-- ======================================== 15-- SELECT ここから 16-- ======================================== 17SELECT DISTINCT b.USER_ID, c.sample_cd 18FROM TableB b 19INNER JOIN TableC c ON (b.USER_ID = c.USER_ID)

こんな感じでしょうか?

投稿2016/02/16 04:46

sk_3122

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ykky

2016/02/16 06:06

大変丁寧な回答ありがとうございます。 TableBとTableCは紐付いていないので、前者のクエリで試してみておりますが、 WITHの使い方がよく分からず、うまくいきません・・。
sk_3122

2016/02/16 06:12 編集

あ、WITH 句は無視してください。 私の環境には TableB や TableC がないので、一時的にその変わりになるものとして書いてあります。 TableB や TableC が存在する環境ではなら、『 SELECT ここから 』より下の部分だけで動きます。 ----- TableB や TableC は仮の名前であり、実際は違う名前だという場合は、書き換えてください。 その際、「TableB のすぐ後ろにある b」 や 「TableC のすぐ後ろにある c」はとりあえず変更しないでそのままでいいです。 (テーブル別名というやつです)
guest

0

N 件になってしまうのが問題でしょうか?
だとすると、DISTINCT を指定するのではどうでしょうか。

sql

1-- ======================================== 2-- これはテストテーブル的なもの 3-- ======================================== 4WITH HogeTbl AS ( 5 SELECT 1 AS Id, 'aaa' AS Name UNION ALL 6 SELECT 1 AS Id, 'aaa' AS Name UNION ALL 7 SELECT 2 AS Id, 'bbb' AS Name UNION ALL 8 SELECT 3 AS Id, 'xxx' AS Name UNION ALL 9 SELECT 4 AS Id, 'xxx' AS Name 10) 11-- ======================================== 12-- 以下 SELECT の例 13-- ======================================== 14 15--SELECT Id, Name FROM HogeTbl -- 全部出る 16 17--SELECT DISTINCT Id, Name FROM HogeTbl --Id,Nameのセットを重複なしで取る 18 19SELECT DISTINCT Name FROM HogeTbl --Nameを重複なしで取る

INSERT ... SELECT DISTINCT ... でどうでしょうかね。

投稿2016/02/16 03:58

編集2016/02/16 04:00
sk_3122

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ykky

2016/02/16 04:02

ご回答ありがとうございます。 Nになるのが問題ではなく、 逆に1:Nの1に同じものをinsertしたいのです。
sk_3122

2016/02/16 04:06 編集

N 件のテーブルの値を 1 件の方に INSERT したいのですよね? INSERT INTO <1件の方のテーブル> colA, colB SELECT DISTINCT cola, colb FROM <N件返るテーブル> では駄目でしょうか?
sk_3122

2016/02/16 04:10

ん?違うか > Bテーブルにある全ての値を同じa_cdと一緒にinsertしたいのです。 ごめんなさい、ちょっとごっちゃになっていました。投入先はどちらのテーブルでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問