こんにちは、また皆様のお知恵をお貸しください。
宜しくお願いします。
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/16 04:29
回答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総合スコア3013
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/16 06:16
2016/02/16 07:42 編集
2016/02/17 00:43 編集
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
総合スコア1126
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/16 06:06
2016/02/16 06:12 編集
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総合スコア1126
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/02/16 04:02
2016/02/16 04:06 編集
2016/02/16 04:10
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。