- ベストアンサー
【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と方言は同じという認識をもってます。 以上宜しくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
なぜFROMに1,2,3を書いているのでしょうか? INTO T-BBS SELECT user-id,1,2,3 FROM T-USR みたいなのではダメですか?
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
>T-USRには1,2,3を含んでいない SELECTはたんにテーブルにある値を表示するというものではない ということを理解した方がいいです。 SELECT 1+1; SELECT NOW(); など表現できます、この場合FROMさえいりません。 今回のケースだと、1,2,3はスタティックな値ですから、 SELECTのところに直ガキすれば問題ありません。
お礼
ご回答ありがとうございます。 >SELECTはたんにテーブルにある値を表示するというものではない ・・・・なるほど。身にしみました。 select current_timestamp (現在の日時) でなぜ表示されるのかも納得です。 重ねてご教授ありがとうございました。
- chukenkenkou
- ベストアンサー率43% (833/1926)
>テーブル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" ではどうでしょうかね?
補足
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)・・・こういう塊に見えてしまうのですが、、、
お礼
ご回答のお礼をつけ忘れていました。 後述のchukenkenkouさんのご指摘によりyambejpさんの指摘されたやり方でできるのではと思い実行すると思った結果を得ることができました。 実行確認もせずすいませんでした。またご回答に感謝します。 しかしながらよくわからない点がありまして、 SELECT user-id,1,2,3 FROM T-USR という下りを思うと T-USRには1,2,3を含んでいないような気がするのですが、含んでいなくてもinsertすることができました。 insertはこういうものだと思うしかないのでしょうか、、、?
補足
ご指摘のように前述の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 のカラムは含んでいません。