• ベストアンサー
  • すぐに回答を!

副問い合わせのinsert文

いつもお世話になっています。 insert文の副問い合わせのことでお聞きしたいのですが、 ■通常のinsert文 insert into AAA values(aaa,bbb,ccc); 上記のsqlを副問い合わせにした場合(aaaに別テーブルからの検索結果を入れたい場合)どういうSQL文になるでしょうか。 参考書等を参照すると、副問い合わせの場合はvaluesを省略する(使えない?)と記述がありました。 insert into AAA values ( aaa IN (SELECT bbb from BBB where ccc = ddd),bbb,ccc); とはできないみたいですので… どうかご教授宜しくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数3878
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.1

>insert into AAA values >( aaa IN (SELECT bbb from BBB where ccc = ddd),bbb,ccc); 構文が不明瞭になるので、bbbがTABLE(BBB)に存在するものか、そうでない方を指しているのか区別するため、 基にするSQLを変更して、比較します。 insert into AAA values ( aaa IN (SELECT xxx from BBB where ccc = ddd),bbb,ccc); という意味のSQLを書きたいのなら、 insert into AAA values ((SELECT xxx from BBB where ccc = ddd),bbb,ccc); なら書けたような気がします。(但し、クエリでの該当レコードは1件であることが条件) いつも私は、クエリが複数件でも支障のない、 insert into AAA SELECT xxx,bbb,ccc from BBB where ccc = ddd; を使います。 クエリが外側の項目や変数を参照できることを利用しています。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

わかりやすい説明ありがとうございます。 早速試してみたいと思います。

関連するQ&A

  • PHP/MySQL INSERT文について。

    PHP/MySQL INSERT文について。 こんばんは。 PHP・MySQLでデータベースへデータの書き込みを試行錯誤しております。 そこで一つどうしても解決出来ない問題(謎)があるので質問させて頂きます。 簡易的な質問内容としては 全てのカラムに対する値の挿入は可能なのに カラムを指定して値を挿入しようとしたらエラーが出ます。 データベースの設定はテーブル名【TESTtable】 フィールド 種別 NULL 属性/その他 AAA int(6) No UNSIGNED ZEROFILL / auto_increment BBB int(4) Yes CCC int(4) Yes DDD int(4) Yes PHPでのSQL実行文をしてはの記述としては(値は全て可変で数値を代入します。) INSERT INTO TESTtable VALUES (last_insert_id(),50,600,50) とした場合は問題無くテーブルに書き込みされますが カラムを指定して INSERT INTO TESTtable (AAA,BBB,CCC,DDD) VALUES (last_insert_id(),50,600,50) とした場合、書き込みが行われません。 INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable (AAA,'BBB','CCC','DDD') VALUES (last_insert_id(),50,600,50) INSERT INTO TESTtable ('AAA','BBB','CCC','DDD') VALUES (last_insert_id(),'50','600','50') 等、色々試してみましたが不可能でした。 カラムAAAはauto_incrementにりますので毎回書き込みされますが BBB、CCC、DDDは書き込みが不要の場合もあるので カラム指定の書き込みは必須となるのですが・・・行き詰ってしまいました・・・。 ご教授頂ければ幸いです。 どうぞ、宜しくお願い致します。

    • ベストアンサー
    • MySQL
  • INSERT文とUPDATE文の使い分け

    いつもお世話になっております。 MYSQLで x_table ID SUBID  1  aaa 2 aaa 3 bbb 4 ccc というテーブルがあったとして、「IDが 1 かつ、SUB_IDが aaa」の項目が存在する場合はUPDATE、存在しない場合はINSERT、という形でSQLを使い分けたいと考えています。 現在は SELECT * FROM x_table WHERE ID=1 AND SUBID='aaa' というSQLでレコードの存在確認をし、その結果によりif文でUPDATE文とINSERT文を使い分けているのですが、レコードの存在確認とINSERTやUPDATEのSQLを一つにまとめる事が出来るようなやり方って無いでしょうか? 無さそうな場合は「無い」とだけでも答えていただけるとうれしいです。

    • ベストアンサー
    • PHP
  • ファイルに記述されている複数のSQL文を一度に実行させたい

    こんにちわ。 ファイルに記述されているSQL文を、Linuxのコマンドラインなどから 実行したいと考えています。 ファイルに insert into DB_NAME(aaa,bbb,ccc) values(111,222,333); insert into DB_NAME(ddd,eee,fff) values(333,777,222); insert into DB_NAME(aaa,ttt,ddd) values(111,000,999); ... などのSQL文が複数行(例えば1000個ほど)記述しているのを用意して なんかしらの方法で一度に実行させたいのです。 mySQLでは、このようなやり方があるのですが postgreではどのようにすればいいのか、わかりません。 どなたかご存知の方、よろしくお願い致します。 OSはLinuxです。

その他の回答 (1)

  • 回答No.2

No1さんの最後に書いてあるのが一般的な例ですね。 Aテーブルに入っているデータを空のBテーブル(表定義は Aテーブルと同じ)にコピーしたいのであれば単純に insert into B select * from A; となります。 select以降は通常のselect文ですので A表に入っているデータの内、col1が100以上のものだけ B表にコピーしたいのであれば insert into B select * from A where A.col1 >= 100; となります。 ※ 空のB表が無く、A表を元に作成するところからはじめる場合は create table B as select * from A; となります。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

返事ありがとうございます。 別パターンでの説明参考になりました。 試してみたいと思います。

関連するQ&A

  • select句副問い合わせ 値の個数が多すぎます

    SQL初心者です。 ORACLEで、SELECT句に副問い合わせを付けたところ、ORA-00913:値の個数が多すぎますとエラーになってしまいます。 解決法をご教授願います。 同一テーブルの同一項目を複数項目として取得したいのです。 SELECT (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.CCC), (SELECT B.DDD ,B.EEE FROM A_MST A ,B_MST B WHERE A.AAA = B.BBB AND A.BBB = CMST.FFF) FROM C_MST CMST WHERE CMST.A_RYAKU = '123'

  • ????

    以下のクエリを実行しました。 insert into test_tbl(aaa,bbb,ccc) values('xx','yy','△△'); ※====『△』は半角スペース==== それで以下のsqlを実行すると select count(*) from test_tbl where ccc = '△△'; --- 1 --- と出ます。それで今度は以下のSQLを記述すると select count(*) from test_tbl where ccc = '△'; --- 1 --- とでます。 因みにテーブル構成は -------------- aaa char(2) bbb char(2) ccc char(2) -------------- です。 どうしてインサートしたデータが"△△"なのに "△"でひっかかるのでしょうか? しつこいようですが、記述中の'△'は半角スペースです。

  • MySQLでWHEN句のサブクエリ中にて

    MySQL ver.5.0.95です。 PHPからSQL文を作ってDBへインサートしているのですが 重複した値が合った場合はupdateするように書いています。 TBL1には |id   |string   |count 1    aaa    0 2    bbb    3 3    ccc    1 TBL2には |id2    |string2    |count2 1      aaa      0 2      bbb      2 3      ccc      1 実際はもう少し複雑ですが、こういう感じでデータが入ってるとします。 このとき、TBL1のそれぞれをインサート若しくはアップデートするのに TBL2の同一IDのものの、count2の状態によって場合分けしたく 同一IDのcount2が1以上なら変更しない、という風にするため以下のように書いたのですが insert into TBL1 values (1, "aaa", 3), (2, "bbb", 3), (3, "ccc", 3), (4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = values(id)) >=1 THEN count ELSE count + values(count) END; #1064 - You have an error in your SQL syntax;というエラーになって出来ません。 WHENの中のサブクエリで、where id2 = values(id) 恐らくこの文がダメなようです。 例えば決め撃ちで1つ1つ書くと通ります。 insert into TBL1 values(1, "aaa", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 1) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(2, "bbb", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 2) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(3, "ccc", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 3) >=1 THEN count ELSE count + values(count) END; insert into TBL1 values(4, "ddd", 3) on duplicate key update count = CASE WHEN (select count2 from TBL2 where id2 = 4) >=1 THEN count ELSE count + values(count) END; これをエラーになったような文に変えて1文にまとめたいのですが、無理でしょうか? あとそもそもこれをまとめたほうが速いと思ってそうしたいのですが、 変わらないのなら1文1文;でつなげて書くやり方でいこうと思っています。 まとめると速くなることはあるでしょうか?

    • ベストアンサー
    • MySQL
  • 副問合せをいれたINSERT文で、問合せ結果が無い場合

    副問合せをいれたINSERT文で、問合せ結果が無い場合 環境はSQL Server2005です。 テーブルA,テーブルBが存在し、テーブルAにレコード追加する際に一部をテーブルBから抽出して、 INSERTしようとしています。 [SQL文]  INSERT INTO テーブルA(フィールド1, フィールド2, フィールド3,フィールド4・・・)   SELECT 'AAA', 'BBB' ,B.フィールド3, B.フィールド4 ・・・   FROM テーブルB B WHERE ~ この場合、テーブルBにWHEREで指定した条件のレコードが存在しない場合はINSERTされなくなってしまいます。 存在しない場合は、該当のフィールドにはNULLをいれたいのですが、テーブルBからの結果が存在しない場合でも テーブルAにINSERTする方法はありますか?

  • AccessSQL 1つのテーブルに複数のデータ

    お世話になっております。 アクセスSQLでの質問です。 --テーブル---------- F_1 F_2 AAA BBB AAA CCC BBB XXX CCC DDD DDD YYY 1.F_1のAAAを条件にF_2のBBB・CCCを取得し、 F_1のBBB・CCCと、F_2のXXXとDDDを取得します。 次に、取得したF_2のXXX・DDDを条件に、F_1のDDD、F_2のYYYを取得します。 つまり、AAAを取得した結果、SQL一つで、上記テーブルデータをF_1:AAA以外、取得したい要件です。 有識者の方、ご享受頂きたいです。 宜しくお願い致します 【自力で考えた結果】 -------------------------- select F_MenuCD,F_ZaiCD from [TABLE] where F_MenuCD IN ( SELECT F_ZaiCD FROM [TABLE] WHERE F_MenuCD IN ('AAA') ); F_1 F_2 BBB XXX CCC DDD を取得するSQLは上記でいけそうなのですが、 DDD YYY を、1つのSQLで取得したいのです。

  • 見たことのないINSERT文

    お世話になります。 他人の書いたSQLを解析して以下のようなコードを見つけました。 CREATE TABLE OYA ( ID NUMBER NOT NULL, NAME VARCHAR2(10) ) / CREATE TABLE KO ( ID NUMBER NOT NULL, OYA_ID NUMBER NOT NULL, NAME VARCHAR2(10) ) / INSERT INTO ( SELECT ID ,OYA_ID ,NAME FROM KO WHERE EXISTS ( SELECT ID FROM OYA WHERE NAME LIKE '%1' ) ) VALUES ( 1 ,1 ,'KODOMO-1' ); INSERT文でテーブル名を指定するかわりにSELECT文を指定しています。 SELECT INSERT文は知っていますが、このような表記は初めてです。 (文法エラーにならないのに驚きました) おそらく意図するところは、ある条件に一致したOYAが存在する場合に、KOをインサートするのだと思いました。 実際は、OYAがなくてもINSERTは実行されてしまいますが。。。 このような表記のINSERT文の説明が書いてあるサイトをご存知の方がいらっしゃいましたら、よろしくお願いします。

  • Insert文で・・・

    失礼します。SQL初心者なので質問します。 Insert into Aテーブル Select X , Y , Z From Bテーブル というSQLがあり、Aテーブルの列数を3から4にした際、AテーブルへのInsertの項目を、BテーブルからSelectされたX,Y,Z以外に普通の変数αも新たに作成した4つめの項目として同時にInsertしたい場合、どのようなSQLにすれば良いでしょうか? Insert into Aテーブル (Select X , Y , Z From Bテーブル),α みたいに都合良くはいきませんよね??

  • 入力値と外部キーをINSERTするには

    追加したいカラムが3つあるとしまして、そのうち2つはフォームからの入力値で、残り1つは別テーブルのIDをWHEREで引っ張ってきてINSERTしたい場合、INSERT...VALUES()とINSERT...SELECT構文を組み合わせないとダメかと思うのですが、組み合わせるとうまくいきません。2つの文に分けるしかないのでしょうか? やりたいことは下の感じのSQLです。が、解釈してくれません。 INSERT INTO room(A, B, C) VALUES (1, 2, SELECT other_table.id FROM other_table WHERE other_table.id = 1");

    • ベストアンサー
    • MySQL
  • INSERT文の副問合わせで*は使えますか?

    ORACLE sqlPlusでの話ですが  例えば、 deptno, dname, loc この三つの属性を持つ、dept表、dept_copy表があったとして INSERT INTO dept_copy SELECT * FROM dept WHERE deptno = 10; このような文は通りますか? CREATE TABLE文ではこのような * を利用してもエラーにはならないはずなのですが。

  • SQLのINSERT文について

    SQLのINSERT文について Accessを使用していて1列目が管理Noとなっています。 その時のレコード数を管理Noに指定したいのですがうまく行きません。 Insert Into TableA Values((Select Count(*) From TableA),'データ') 原因もしくは他の方法があればご教授お願いします。