12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

スカラ・サブクエリ

Posted at

サブクエリに対してスカラ・サブクエリは、「必ず 1 行 1 列だけの戻り値を返す」という制限をつけたサブクエリのことです。スカラ・サブクエリの戻り値が単一の値ということは、この戻り値を比較演算子による値の比較に利用できます。

※スカラは単一という意味。

スカラ・サブクエリを書ける場所は、WHERE 句などでの比較演算子の入力部分だけに限りません。基本的に、スカラ値が書けるところにはどこにでも書けます。ということは、定数や列名を書くことの出来る場所全てとなり、SELECT 句でも GROUP BY 句でも HAVING句でも ORDER BY 句でも、ほとんどあらゆる場所に書くことが可能です。

  • 例1 :主キーでしぼったスカラサブクエリ
select d.DEPARTMENT_NAME from hr.DEPARTMENTS d
where d.DEPARTMENT_ID = 10
  • 例2 :rownum=1を指定したスカラサブクエリ
select d.DEPARTMENT_NAME from hr.DEPARTMENTS d
where rownum = 1

上の検索結果はどちらも以下。1列だけの値を1行だけ返しているのでこれらはスカラサブクエリであります。

DEPARTMENT_NAME
Administration

スカラ・サブクエリを使うときの注意点

スカラ・サブクエリを使うときに最も注意しなければならないことは、「絶対にサブクエリが複数行を返さないようにする」ことです。というのも、サブクエリが複数行を返す時点で既にそれはスカラ・サブクエリではなく、ただのサブクエリになってしまいます。すると、=、<>といったスカラ値を入力する演算子も利用出来ませんし、SELECT 句などに書くことも出来なくなります。

スカラサブクエリというのは… 少し妙な表現かもしれませんが,「デリケートな」技術です。必ず単一の値(つまり1行だけ)を返すようにサブクエリ内の条件を設定しなければ,エラーになります。それは195ページからの「存在の階層」節で見たとおりです。

Itemsテーブルにおいて,たまたまピーマンの値段が200円だったとしたら― たまたま商品グループ単位で最高値の商品が1つになる,という状況になります。こういうケースだけを想定してサブクエリを使っていると,それまでは偶然動作していたSQL文が,ある日突然「このサブクエリは複数行を返します」というエラーを引き起こすことになります。だから,スカラサブクエリを使うときは,戻り値が本当に,いつでも,常に,1行であることを,入念にチェックしてください。でないと,システムのカットオーバー後しばらくして,間違いなくクライアントから一報を受けることになるでしょう。

スカラサブクエリについてのもうひとつの注意点は,パフォーマンスに関するものです。一般的に,SELECT句においてスカラサブクエリを使うのは,かなりコストの高い方法です。したがって,相関サブクエリとして使う場合は,サブクエリ内の結合条件でなるべくインデックスを利用できるよう配慮することが重要です。

12
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?