• ベストアンサー

【SQL文】Insert into文で文法エラー

insert into文で思ったような結果がでません。SQL文にお詳しい方、ご教授いただけますでしょうか? SQLは初心者レベルです。 期待している結果: テーブルT-BBSにT-USRのusr-id全リストを入れて、T-BBSのa,b,cには固定の数値を入れたいと思っています。 テーブル例: テーブル名:T-BBS ,カラム:usr-id,a,b,c, テーブル名:T-USR, カラム:usr-id 結果 user-id | a | b | c 2 |1 | 2 | 3 3 |1 | 2 | 3 4 |1 | 2 | 3 7 |1 | 2 | 3 私が考えたSQL文ですが、 INSERT INTO T-BBS(SELECT user-id FROM T-USR,1,2,3) →×(文法エラー) INSERT INTO T-BBS(user-id,a,b,c) VALUES (SELECT user-id FROM T-USR,1,2,3)→× 文法エラー INSERT INTO T-BBS(user-id,a,b,c) VALUES ((SELECT user-id FROM T-USR),1,2,3)→×サブクエリが複数行を含んでいる ちなみにデータベースはH2 Databaseというものみたいですが、mySQLと方言は同じという認識をもってます。 以上宜しくお願いします。

  • MySQL
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

なぜFROMに1,2,3を書いているのでしょうか? INTO T-BBS SELECT user-id,1,2,3 FROM T-USR みたいなのではダメですか?

momonova
質問者

お礼

ご回答のお礼をつけ忘れていました。 後述のchukenkenkouさんのご指摘によりyambejpさんの指摘されたやり方でできるのではと思い実行すると思った結果を得ることができました。  実行確認もせずすいませんでした。またご回答に感謝します。 しかしながらよくわからない点がありまして、 SELECT user-id,1,2,3 FROM T-USR という下りを思うと T-USRには1,2,3を含んでいないような気がするのですが、含んでいなくてもinsertすることができました。 insertはこういうものだと思うしかないのでしょうか、、、?

momonova
質問者

補足

ご指摘のように前述の1番目、2番目は変に感じます。 イメージ的には、 INSERT INTO T-BBS(user-id,a,b,c) VALUES ((SELECT user-id FROM T-USR),1,2,3) みたいにしたいと思っています。(ニュアンスが伝わりますでしょうか?) また T-USRには a=1,b=2,c=3 のカラムは含んでいません。

その他の回答 (2)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>T-USRには1,2,3を含んでいない SELECTはたんにテーブルにある値を表示するというものではない ということを理解した方がいいです。 SELECT 1+1; SELECT NOW(); など表現できます、この場合FROMさえいりません。 今回のケースだと、1,2,3はスタティックな値ですから、 SELECTのところに直ガキすれば問題ありません。

momonova
質問者

お礼

ご回答ありがとうございます。 >SELECTはたんにテーブルにある値を表示するというものではない ・・・・なるほど。身にしみました。 select current_timestamp (現在の日時) でなぜ表示されるのかも納得です。 重ねてご教授ありがとうございました。

回答No.2

>テーブルT-BBSにT-USRのusr-id全リストを入れて >ちなみにデータベースはH2 Databaseというものみたいですが、mySQLと方言は同じという認識をもってます。 まず、提示された表名、列名は、実際にテストしているものですか? 「-」は減算と判断されるため、「-」を含む名前を使い場合は、「"」などで囲む必要があります。 「など」としたのは、この部分にMySQLなど一部RDBMSでは、独自仕様があるためです。 標準SQLや主要なRDBMSでは、予約語や特殊記号を含む表名や列名を使いたい場合、「"」(二重引用符)で名前を囲みます。 しかし、MySQLでは「`」(バッククォート)で囲むという仕様です。MySQLでは、「ANSI構文モード」にしてサーバを起動しなければ、「"」(二重引用符)で囲まれたものは、文字定数として扱われます。 SQL Serverなどマイクロソフト製品では、[ ] で囲むといった仕様もあります。 文法エラーとだけ書くのでなく、具体的なエラーメッセージを提示するようにしてください。 MySQLと同じなら、 INSERT INTO `T-BBS` SELECT `user-id`,1,2,3 FROM `T-USR` といった記述ではどうでしょうか? あるいは、MySQLと同じでなく標準SQL準拠なら、 INSERT INTO "T-BBS" SELECT "user-id",1,2,3 FROM "T-USR" ではどうでしょうかね?

momonova
質問者

補足

chukenkenkouさんご回答ありがとうございます。 ご指摘のごとく 実際のテーブル名でありませんでした。 不正確な質問で皆様すいませんでした。 また テーブル名は正確にはT_USR でした。 ・mySQLが標準と思っていましたので、ご回答はとても役に立ちました。 >「-」は減算と判断されるため、「-」を含む名前を使い場合は、「"」などで囲む必要があります。 結果的には:INSERT INTO T_BBS SELECT USER_ID,1,2,3 FROM T_USRで 思った結果を得ることができました。 腑に落ちないのは、T_USRには1,2,3をもっていなくてもINSERTできるのだということとです。どういう解釈なのでしょうか? (SELECT USER_ID,1,2,3 FROM T_USR)・・・こういう塊に見えてしまうのですが、、、

関連するQ&A

  • 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
  • ACCESS SQLのINSERTについて

    TBLというテーブルにINSERT文を使用して1行レコードを追加したいです。TBLテーブルのカラムAにはシステム日付を、カラムBには別テーブルのselect count(*)の実行結果を挿入したいのですがうまくいきません。何か良い方法はございませんでしょうか? INSERT INTO カウンタ統計 ( [DATE], USER_COUNT ) VALUES (date(), (SELECT COUNT(*) FROM hiplus_HW_USER)); ※日付は問題なく挿入できるのですがSELECT文の結果が挿入できない状況です。宜しくお願いします.

  • SQLのINSERT文について

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

  • 1つのSQL文で検索し、その結果をINSERTしたい

    いつもお世話になっております。 今回、AテーブルとBテーブルを調べてデータに差分があれば、その差分データを元にCテーブルからデータを取ってきて、取ってきたデータをDテーブルに追加する、というSQLを1文で書くようにと言われました。 Cテーブルからデータを取ってくるところまではできたのですが、それをDテーブルにINSERTするにはどうしたら良いのかがわかりません。 Cテーブルから取得するデータは5件です。 DテーブルにはCテーブルから取得したデータ以外にも3件入力する項目があります。 現状を簡単に表現すると INSERT INTO Dテーブル(ア,イ,ウ,エ,オ,カ,キ,ク) VALUES((SELECT あ,い,う,え,お FROM Cテーブル),か,き,く); のようにやってみたのですが、うまくいきません。 こういう場合の記述方法をご存知の方がいらっしゃいましたら、教えてください。 よろしくお願いいたします。

  • SQLでできますか?

    SQLでできますか? INSERT INTO test (A) VALUES (B)というSQLを発行したいのですが、このSQLのVALUESのBにあたる部分を正規表現的に指定して、一度のクエリで以下のような結果を得たいのです。 1.テーブルhogeのpiyoカラムの値の先頭がappleになっている行を探す。 2.(1.)で抽出した行のidの値をBとする。 例えば、以下のようにです。 ■皆様が回答してくださるSQL文(1クエリで行いたい) ???????????? ■皆様が回答してくださるSQL文と同等の意味を持つSQL群 INSERT INTO test (A) VALUES (100) INSERT INTO test (A) VALUES (101) INSERT INTO test (A) VALUES (102) ■テーブルhoge _____id_____piyo__________created 1. 100 applebanana 2009/01/02 2. 101 apple_12345 2009/01/03 3. 102 appleXXXXXX 2009/01/04 4. 103 bananananan 2009/01/05 5. 104 ringogogogo 2009/01/06 分かりにくい説明ですが、お詳しい方、どうかご回答の程を宜しくお願いいたします。

    • ベストアンサー
    • MySQL
  • INSERT INTOに関しまして。

    $sql = "INSERT INTO テーブル名(name,day,kg)VALUES('','$day','-1')"; 現在このようなSQL文でINSERTしていますが、データベース内にあるカラムname全てに対してINSERTするにはどうすれば良いでしょうか??現在のSQL文ではそれができず、nameが空欄の状態で更新されてしまいます。

    • ベストアンサー
    • PHP
  • 副問い合わせの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); とはできないみたいですので… どうかご教授宜しくお願いします。

  • insert into select で別テーブルのID分挿入したい

    SQLでこんなことは可能でしょうか。 列 IDとTEXT をもつテーブルA と、 列 IDをもつテーブルBがあります。 テーブルAに、テーブルBのID分のデータを挿入したいです。 TEXTはテーブルAのID=1のTEXTデータを全ての列に挿入します。 このような場合のSQL文を調べてるのですが、 なかなかわからなくて困っています。 insert into select b.id,a.text from tableA as a, tableB as b でもうまくいきませんでした。 何かいい方法はないでしょうか? 回答お待ちしております。

  • Insert Into Select での重複について

    DB:SQLServer2000 こんにちは お世話になっております。 トランザクションのテーブルA から ワークのテーブルBへInsert Into Select を使用してデータを格納しているのですが、その際に重複が発生してしまいます。 テーブルA 主キーあり テーブルB 主キーなし Delete B Insert into B select 項目1,項目2,・・・ from A With(Nolock) where 日付項目 = 20080101 テーブルAの主キー項目は全てテーブルBへInsertしており、Insert完了後のテーブルBの中身を見ると、まれに全く同じデータが2件出来ていることがあります。 このInsert into selectが実行されている間に、テーブルAに対して登録更新が行われることもあります。 色々と試してはいるのですが、原因が特定できずに困っております。 もし何かお気づきになられる方がいらっしゃいましたら、ご教示下さい。 よろしくお願い致します。