※当サイトの記事には、広告・プロモーションが含まれます。

Oracle Databaseで、from DUALテーブルしなくても固定値がSELECTできるのを知る

gigazine.net

⇧『爆縮』『圧壊』のどちらが適切かはさておき、

news.yahoo.co.jp

⇧ 3500万円、もっと有意義な使い道あっただろうに...ご冥福をお祈りいたしますか...

Oracle DatabaseのDUALテーブルとは?

Oracleさんの公開しているドキュメントによりますと、

docs.oracle.com

DUALは、データ・ディクショナリとともにOracle Databaseによって自動的に作成された表です。

https://docs.oracle.com/cd/F19136_01/sqlrf/Selecting-from-the-DUAL-Table.html#GUID-0AB153FC-5238-4E79-8522-C9E2A04AB5E4

DUALは、ユーザーSYSスキーマにありますが、すべてのユーザーがDUALという名前でアクセスすることができます。VARCHAR2(1)として定義されているDUMMY列を持ち、X値を持つ行を含みます。DUAL表から選択することは、定数式をSELECT文で計算する場合に便利です。 DUALには行が1つしかないため、定数が返されるのは1回のみです。一方で、任意の表から定数、疑似列または式を選択できますが、値は表の行の数のみ戻されます。DUALから定数値を選択する例は、「SQLファンクション」を参照してください。

https://docs.oracle.com/cd/F19136_01/sqlrf/Selecting-from-the-DUAL-Table.html#GUID-0AB153FC-5238-4E79-8522-C9E2A04AB5E4

⇧ とあるように、1行だけのデータを取得できるってことらしいのだけど、DUALとは関係なく、普通のテーブルでも固定値をSELECTできるってのは知らなんだ...

Oracle Databaseで、from DUALテーブルしなくても固定値がSELECTできるのを知る

ということで、実際にやってみた。

ts0818.hatenablog.com

⇧ 上記の記事の時のテーブルを利用してます。

■普通にDUALテーブルから固定値をSELECT

SELECT
 '0001' as id
 , '0000000000001' as code
 , '札幌グランドホテル' as name
FROM dual;    

■DUALテーブルから固定値をSELECT。固定値をDUALテーブルからSELECTするを混ぜる

SELECT
 '0001' as id
,(SELECT '0000000000001' FROM dual) as code
,(SELECT '札幌グランドホテル' FROM dual) as name
FROM dual;

■普通のテーブルから固定値をSELECT。普通のテーブルのカラムも取得できる。

SELECT
 '0001' as id
,(SELECT '0000000000001' FROM dual) as code
,(SELECT '札幌グランドホテル' FROM dual) as name
, FACILITY_CODE
FROM W_M_FACILITY facility
WHERE NOT EXISTS(
SELECT *
FROM W_M_FACILITY
WHERE FACILITY_CODE = '99999'
)
AND facility.FACILITY_CODE = '0000000000001';

■普通のテーブルから固定値をSELECT。普通のテーブルのカラムも取得できる。行数を絞らない。

SELECT
 '0001' as id
,(SELECT '0000000000001' FROM dual) as code
,(SELECT '札幌グランドホテル' FROM dual) as name
, FACILITY_CODE
FROM W_M_FACILITY facility
WHERE NOT EXISTS(
SELECT *
FROM W_M_FACILITY
WHERE FACILITY_CODE = '99999'
)
-- AND facility.FACILITY_CODE = '0000000000001'
;   

確かに、条件絞らないと複数行取得できますね。DUALテーブルからのSELECTだと必ず、1行しか取得できなかったけど。

ちなみに、

stackoverflow.com

⇧ 上記サイト様によりますと、副問い合わせなどを組み合わせて、間接的にDUALテーブルとJOINすることはできても、直接DUALテーブルとJOINするのは無理っぽい。

SELECT
  filter.code
  ,facility.*
FROM
(
  SELECT '0000000000001' AS code FROM dual
) filter
INNER JOIN W_M_FACILITY facility
ON filter.code = facility.FACILITY_CODE;

中間テーブルっぽいのを作ってJOINするしかない感じなのかな?

とりあえず、固定値をSELECTするのに、DUALテーブルである必要はないということが分かった今日この頃です...

毎度モヤモヤ感が半端ない...

今回はこのへんで。