0

重複の可能性:
Oracle のデュアル テーブルとは何ですか?

私はいつもクエリがどのようになっているのか疑問に思っていました:

select sysdate
from dual;

また

select 8
from dual;

仕事する。

select ステートメントに慣れているので、特定のテーブルから列の値を選択します。しかし、上記の例では、表の二重には sysdate または '8' 列しかありません....

誰かがそれがどのように機能するか説明してもらえますか?

4

2 に答える 2

1

列を選択する必要はありません。列、定数値、関数呼び出し、計算などで式を選択できます。したがって、従業員テーブルからこれを選択できます

select 
  e.nr,  -- column
  upper(e.name) as name, -- Function call to change the name to uppercase.
  e.age + 5 as age, -- expression with calculation with column value. 
  1  -- Just a value. Contains 1  for each row that the query returns.
from 
  employees e;

as nameおよび に注意してくださいas age。これは、式に列名以外のものが含まれると、列名が失われるためです。その場合、クエリ結果で列に付ける名前を指定できます。テーブル名自体にも同様のトリックが行われます。エイリアスeは単なる省略形です。これは、(結合で) 複数のテーブルを使用する場合に特に便利です。この単純なクエリでは、テーブル エイリアスを完全に省略できます。

dualは、正確に 1 つの行と という名前の 1 つの列を持つ特別なテーブルですdummyこれには、以前に説明したさまざまな用途があります。他の一部のデータベースでは、 をまったく使用する必要はありませんdual。たとえば、MySQL では次のように記述できます。

select
  1;
于 2012-12-01T20:01:36.960 に答える
0

1行だけのテーブルです。これは Oracle のCharles Weissによって作成され、Oracle Data Dictionary の内部ビューに結合するためのテーブルを提供します。

Oracle Data Dictionary の基礎となるオブジェクトとして DUAL テーブルを作成しました。それ自体が表示されることは決して意図されていませんでしたが、代わりに、クエリが予想されるビュー内で使用されていました。アイデアは、DUAL テーブルに JOIN を実行し、テーブルの 1 行ごとに結果に 2 行を作成できるというものでした。次に、GROUP BY を使用して、結果の結合を要約し、DATA エクステントと INDEX エクステントのストレージの量を示すことができます。DUAL という名前は、1 つの行から 2 つの行を作成するプロセスに適しているように思われました。

デュアルで活用できる優れた機能がたくさんあります。これを使用して、数値のリストを生成します。例えば

SELECT LEVEL just_a_column
FROM dual
CONNECT BY LEVEL <= 365

また、10g の時点で、Oracle は独自の用途でデュアルを認識しており、9i 以前の論理読み取り/全テーブル スキャンはアプリケーションから削除されていることに注意してください。10g にアップグレードすると、デュアルを使用するアプリケーションのパフォーマンスが大幅に向上しました。(たとえば、デュアルから sysdate を選択します)。

プランの例の説明: 10g 以降では、デュアルは魔法のテーブルです。デュアルから sysdate を選択すると、プランは次のようになります。

sql> select sysdate from dual;

SYSDATE
---------
12-DEC-02


Execution Plan
-----------------------------------------------------------------
| Id  | Operation        | Name | Rows  | Cost (%CPU)| Time     |
-----------------------------------------------------------------
|   0 | SELECT STATEMENT |      |     1 |     2   (0)| 00:00:01 |
|   1 |  FAST DUAL       |      |     1 |     2   (0)| 00:00:01 |
-----------------------------------------------------------------
于 2012-12-01T20:12:08.397 に答える