web-dev-qa-db-ja.com

複数の行を挿入している間、ステートメント 'select 1 from dual'は何をしますか?

次のスタイルを使用してテーブルに複数の行を挿入する場合:

insert all

into ghazal_current (GhazalName,Rating) values('Ajab Apna Haal Hota Jo Visaal-e-Yaar Hota',5)
into ghazal_current (GhazalName,Rating) values('Apne Hothon Par Sajana Chahta Hun',4)
into ghazal_current (GhazalName,Rating) values('Shaam Se Aankh Mein Nami Si Hai',4)
into ghazal_current (GhazalName,Rating) values('Tumhe Yaad Ho Ke Na Yaad Ho',3)

select 1 from dual;

ステートメントは何ですかselect 1 from dual意味?ここは何のためですか?

14
Y.E.P

DUALは組み込みのテーブルであり、 1行のみを返す であることが保証されているので便利です。これは、DUALを使用してusersysdateなどの疑似列、計算結果などを取得できることを意味します。 DUALの所有者はSYSですが、すべてのユーザーがアクセスできます。 DUALは、ドキュメントで詳しく説明されています。 詳細

あなたの場合、SELECT 1 FROM DUAL;は単に1を返します。 INSERT ALL構文にはSELECT句が必要ですが、テーブルからの入力値をクエリしていないため、これが必要です。

10
Roney Michael

1行テーブルの簡単な再紹介

一部のSQLデータベースでは、すべての値を取得する必要があります[〜#〜] from [〜#〜]テーブルまたはテーブルのようなオブジェクトですが、その他のデータベースでは、クエリで値を作成できますex nihilo

_-- MySQL, sqlite, PostgreSQL, HSQLdb, and many others permit
-- a "naked" select:
SELECT 1;

-- Others *require* a FROM target, like Oracle.
SELECT 1 FROM DUAL;

-- ...and Firebird/Interbase:
SELECT 1 FROM RDB$DATABASE;

-- ...and DB2:
SELECT 1 FROM SYSIBM.SYSDUMMY1;
_

ここでは、DUALのカーディナリティが重要です。複数の行がある場合、結果セットには複数の行が含まれます。たとえば、_SELECT 1 FROM A_Table_With_Ten_Rows_の場合はどうなりますか?

ここでDUALが使用される理由

SQLコンストラクターVALUES (<row-value-expression>)は行値コンストラクターです。 VALUES (1, 2, 3)は、_SELECT 1, 2, 3_と同じように、値の行を「作成」します。

もちろん、Oracleでは、これらの値が[〜#〜] from [〜#〜]どこかにある必要があります。

デモンストレーションとして、INSERT ALLの最後でDUALからSELECTする代わりに、[〜#〜] n [〜#〜]行のテーブルを試してみてください。各VALUES()行が挿入されます[〜#〜] n [〜#〜]回。

3
pilcrow