お世話になります。
他人の書いた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文の説明が書いてあるサイトをご存知の方がいらっしゃいましたら、よろしくお願いします。
No.2ベストアンサー
- 回答日時:
インライン・ビューと呼ばれる書式です。
ご質問の例では,ビューを経由してその元表である実表にデータ挿入しているわけです。OYA表のNAME列の値が'……1'というパターンにマッチするデータが存在するなら,というWHERE句が無視される理由も下記URLに書いてあります。
http://www.jjon.com/oracle/OracleSilver2002/12/i …
http://www.istudy.ne.jp/ilnews/vol306/sql.asp
ありがとうございます。大変勉強になりました。
インラインビューという書式なのですね。
名前がわからなかったため検索するキーワードも思いつきませんでした。
No.5
- 回答日時:
>into の後に実表名 KO を書いてください
すいません、ケアレスミスです。
ANo.4の件、納得できました。
jjon-comさん、ありがとうございました。
No.4
- 回答日時:
#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 …
No.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');
と同義なのですね?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 次の時間帯の勝率の合計を求めるSQL文 1 2023/07/04 17:12
- PHP php エラー 2 2022/10/23 16:43
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- PHP プログラムコードを入力する場合改行してもいいですか? 2 2022/10/02 16:05
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- MySQL mysqlで INSERT と SELECTの用途は 1 2022/04/01 00:45
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
単一グループのグループ関数で...
-
group byの並び順を変えるだけ...
-
【PL/SQL】FROM区に変数を使う方法
-
AccessのSQL文で1件のみヒット...
-
SELECT FOR UPDATE で該当レコ...
-
BLOB型項目をSQLの検索条件に指...
-
where句中のtrim関数について
-
「数字で始まらない」ものを抽...
-
引数によってwhere句を切り替え...
-
データ
-
トランザクションログを出力せ...
-
ORMについて
-
PL/SQL内の共通関数の引数にフ...
-
ACCESS レコードの並び順について
-
アクセスのレポートでレコード...
-
レコードの更新履歴について
-
Oracleですがsqlで質問です。 ...
-
SQLで条件にヒットしたレコード...
-
【SQL】違うフィールド同士の集...
-
SQL初心者です。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
単一グループのグループ関数で...
-
【PL/SQL】FROM区に変数を使う方法
-
SELECT FOR UPDATE で該当レコ...
-
AccessのSQL文で1件のみヒット...
-
where句中のtrim関数について
-
アクセスのレポートでレコード...
-
group byの並び順を変えるだけ...
-
引数によってwhere句を切り替え...
-
SQL*Loader Append
-
SQLで条件にヒットしたレコード...
-
updateで複数行更新したい
-
データ
-
トランザクションログを出力せ...
-
「数字で始まらない」ものを抽...
-
大量レコードをTRUNCATEせずに...
-
osqleditについて
-
BLOB型項目をSQLの検索条件に指...
-
これをSQL文で出来るでしょうか?
-
ACCESS レコードの並び順について
-
【SQL】違うフィールド同士の集...
おすすめ情報