アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
他人の書いたSQLを解析して以下のようなコードを見つけました。

CREATE TABLE OYA (
IDNUMBERNOT NULL,
NAMEVARCHAR2(10)
)
/

CREATE TABLE KO (
IDNUMBERNOT NULL,
OYA_IDNUMBERNOT NULL,
NAMEVARCHAR2(10)
)
/

INSERT INTO
(
SELECT ID
,OYA_ID
,NAME
FROMKO
WHEREEXISTS (
SELECT ID
FROM OYA
WHERE NAME LIKE '%1'
)
)
VALUES
(
1
,1
,'KODOMO-1'
);


INSERT文でテーブル名を指定するかわりにSELECT文を指定しています。
SELECT INSERT文は知っていますが、このような表記は初めてです。
(文法エラーにならないのに驚きました)
おそらく意図するところは、ある条件に一致したOYAが存在する場合に、KOをインサートするのだと思いました。
実際は、OYAがなくてもINSERTは実行されてしまいますが。。。
このような表記のINSERT文の説明が書いてあるサイトをご存知の方がいらっしゃいましたら、よろしくお願いします。

A 回答 (5件)

インライン・ビューと呼ばれる書式です。

ご質問の例では,ビューを経由してその元表である実表にデータ挿入しているわけです。
OYA表のNAME列の値が'……1'というパターンにマッチするデータが存在するなら,というWHERE句が無視される理由も下記URLに書いてあります。
http://www.jjon.com/oracle/OracleSilver2002/12/i …
http://www.istudy.ne.jp/ilnews/vol306/sql.asp
    • good
    • 0
この回答へのお礼

ありがとうございます。大変勉強になりました。
インラインビューという書式なのですね。
名前がわからなかったため検索するキーワードも思いつきませんでした。

お礼日時:2007/04/23 09:43

>into の後に実表名 KO を書いてください


すいません、ケアレスミスです。

ANo.4の件、納得できました。
jjon-comさん、ありがとうございました。
    • good
    • 0

#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の前半の問いはその通り,登録されます。

参考URL:http://www.ianywhere.com/developer/product_manua …
    • good
    • 0

私も、この書き方は知らなかったので、


回答ではなく便乗質問させてもらいますが、
質問でのSQLには
WITH CHECK OPTIONが指定されていないので、
OYA表のNAMEに'%1'に該当するデータが無くても、
KO表に無条件で
(1,1,'KODOMO-1');
データが登録されるわけですね?

結局、質問のSQLは
insert into (ID,OYA_ID,NAME) values (1,1,'KODOMO-1');
と同義なのですね?
    • good
    • 0
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!