副問合せの謎


  副問い合わせが使用できる句?

ある書籍では、副問い合わせが使用できる句としてfromwherehaving としていますが、実際は select でも使用できます。これは、Oracle に限らず常識的な事だと思っていたのですが何故か select が勘定に入っていません。

そもそも、問題として考えた時にどの「句」で使用できるかというのはちょっと強引なような気がしますが、問題を作った人にそれなりの意図があったのかとは思います。しかし、謎はそれだけではありません。

  スカラー副問合せ式




Oracle のマニュアルでの表現ですが、要するに1つの列を指定した1行を戻す副問い合わせは式として使用できる という事なのですが、もっともな事で、これは副問合せを使用する時の基本的なガイドラインではあります。

行を戻さない時は、NULL であり、2行以上を戻す時はエラーです。全く問題ありません。しかし、このような但し書きがあります。

  

次の場所では、スカラー副問合せは無効です

列のデフォルト値
クラスタのハッシュ式
DML 文RETURNING 句
ファンクション索引の基礎
CHECK 制約
CASE 式のWHEN 条件
GROUP BY 句およびHAVING 句
START WITH 句およびCONNECT BY 句
CREATE PROFILE などの問合せに関連しない文
  

何故 HAVING 句があるのでしょう?

  HAVING 句での副問合せ

  

select
	deptno,
	count(deptno)
from emp
group by deptno
having
	count(deptno) > (select avg(count(deptno)) from emp group by deptno);
  

これは、「そんなバカな」と思って作ったテストクエリーですが、各部署に所属する人数の平均より多い人数が所属する部署を表示するものです。結果は以下のようになります

DEPTNO COUNT(DEPTNO)
1 20 5
2 30 6

当然ですが、HAVING 句を指定しなければ以下のようになります。平均は4.66666666666667です

DEPTNO COUNT(DEPTNO)
1 10 3
2 20 5
3 30 6


  SELECT 句での副問合せ

  

select ename,(select ename from emp where empno = e.mgr) as 管理者 from emp e
  

ENAME 管理者
1 SMITH FORD
2 ALLEN BLAKE
3 WARD BLAKE
4 JONES KING
5 MARTIN BLAKE
6 BLAKE KING
7 CLARK KING
8 SCOTT JONES
9 KING  
10 TURNER BLAKE
11 ADAMS SCOTT
12 JAMES BLAKE
13 FORD JONES
14 MILLER CLARK

これは、自己結合 で良く引き合いに出される社員と社員の管理者の関係を示すものです。結合のほうが検索速度は優れているような気はしますが、帳票出力というような実用の際はこのような使い方をする場面が少なくないと思います。





yahoo  google  MSDN  MSDN(us)  WinFAQ  Win Howto  tohoho  ie_DHTML  vector  wdic  辞書  天気 


[oracle]
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; ClaudeBot/1.0; +claudebot@anthropic.com)
24/04/19 13:54:34
InfoBoard Version 1.00 : Language=Perl

1 BatchHelper COMprog CommonSpec Cprog CprogBase CprogSAMPLE CprogSTD CprogSTD2 CprogWinsock Cygwin GameScript HTML HTMLcss InstallShield InstallShieldFunc JScript JScriptSAMPLE Jsfuncs LLINK OldProg OracleGold OracleSilver PRO PRObrowser PROc PROconePOINT PROcontrol PROftpclient PROjscript PROmailer PROperl PROperlCHAT PROphp PROphpLesson PROphpLesson2 PROphpLesson3 PROphpfunction PROphpfunctionArray PROphpfunctionMisc PROphpfunctionString PROsql PROvb PROvbFunction PROvbString PROvbdbmtn PROvbonepoint PROwebapp PROwin1POINT PROwinSYSTEM PROwinYOROZU PROwindows ProjectBoard RealPHP ScriptAPP ScriptMaster VBRealtime Vsfuncs a1root access accreq adsi ajax amazon argus asp aspSample aspVarious aspdotnet aw2kinst cappvariety centura ckeyword classStyle cmaterial cmbin cmdbapp cmenum cmlang cmlistbox cmstd cmstdseed cmtxt cs daz3d db dbCommon dbaccess dnettool dos download flex2 flex3 flex4 framemtn framereq freeWorld freesoft gimp ginpro giodownload google hdml home hta htmlDom ie9svg install java javaSwing javascript jetsql jquery jsp jspTest jspVarious lightbox listasp listmsapi listmsie listmsiis listmsnt listmspatch listmsscript listmsvb listmsvc memo ms msde mysql netbeans oraPlsql oracle oracleWiper oraclehelper orafunc other panoramio pear perl personal pgdojo pgdojo_cal pgdojo_holiday pgdojo_idx pgdojo_ref pgdojo_req php phpVarious phpguide plsql postgres ps r205 realC realwebapp regex rgaki ruby rule sboard sc scprint scquest sdb sdbquest seesaa setup sh_Imagick sh_canvas sh_dotnet sh_google sh_tool sh_web shadowbox shgm shjquery shvbs shweb sjscript skadai skywalker smalltech sperl sqlq src systemdoc tcpip tegaki three toolbox twitter typeface usb useXML vb vbdb vbsfunc vbsguide vbsrc vpc wcsignup webanymind webappgen webclass webparts webtool webwsh win8 winofsql wmi work wp youtube