- 締切済み
見たことのない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文の説明が書いてあるサイトをご存知の方がいらっしゃいましたら、よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
>into の後に実表名 KO を書いてください すいません、ケアレスミスです。 ANo.4の件、納得できました。 jjon-comさん、ありがとうございました。
- jjon-com
- ベストアンサー率61% (1599/2592)
#3の後半の問いは,into の後に実表名 KO を書いてください。書いてあるならその通り,同義です。 念のため確認しておきます。 -------------------------------- create view TEMP_KO as SELECT ID, OYA_ID, NAME FROM KO WHERE EXISTS (SELECT ID FROM OYA WHERE NAME LIKE '%1'); insert into TEMP_KO(ID, OYA_ID, NAME) values (1, 1, 'KODOMO-1'); -------------------------------- という2つの文を,TEMP_KOという一時表を作らないで一文にまとめたのがご質問のあったインラインビューの書式です。 キーワード with-check-option でgoogleして最上位にヒットする,参考URLもご参照ください。WHERE dept_id = 200 で抽出されたビューに対して,UPDATE ビュー SET dept_id = 400 が成功しています。CREATE VIEWで指定されたWHERE句はビューに対するDML命令では評価されない,DML実行時にその条件を検査したいのならWITH CHECK OPTIONを指定します。ということで,#3の前半の問いはその通り,登録されます。
私も、この書き方は知らなかったので、 回答ではなく便乗質問させてもらいますが、 質問でのSQLには WITH CHECK OPTIONが指定されていないので、 OYA表のNAMEに'%1'に該当するデータが無くても、 KO表に無条件で (1,1,'KODOMO-1'); データが登録されるわけですね? 結局、質問のSQLは insert into (ID,OYA_ID,NAME) values (1,1,'KODOMO-1'); と同義なのですね?
- jjon-com
- ベストアンサー率61% (1599/2592)
インライン・ビューと呼ばれる書式です。ご質問の例では,ビューを経由してその元表である実表にデータ挿入しているわけです。 OYA表のNAME列の値が'……1'というパターンにマッチするデータが存在するなら,というWHERE句が無視される理由も下記URLに書いてあります。 http://www.jjon.com/oracle/OracleSilver2002/12/index.html http://www.istudy.ne.jp/ilnews/vol306/sql.asp
- toshi_2000
- ベストアンサー率30% (306/1002)
お礼
ありがとうございます。大変勉強になりました。 インラインビューという書式なのですね。 名前がわからなかったため検索するキーワードも思いつきませんでした。