You are on page 1of 16

9

SQL Queries and Subqueries 9-1


9 SQL Queries and Subqueries
Tlis claplor doscribos SQI quorios and subquorios.
Tlis claplor conlains lloso soclions:
Aboul Quorios and Subquorios
Croaling SimpIo Quorios
HiorarclicaI Quorios
Tlo UNION |AII], INTIRSICT, MINUS Oporalors
Sorling Quory RosuIls
}oins
Using Subquorios
Unnosling of Noslod Subquorios
SoIocling from llo DUAI TabIo
Dislribulod Quorios
About 0uer|es and $ubquer|es
A query is an oporalion llal rolriovos dala from ono or moro labIos or viovs. In llis
roforonco, a lop-IovoI SFLFCT slalomonl is caIIod a query, and a quory noslod villin
anollor SQI slalomonl is caIIod a subquery.
Tlis soclion doscribos somo lypos of quorios and subquorios and lov lo uso llom. Tlo
lop IovoI of llo synlax is slovn in llis claplor. Rofor lo SIIICT on pago 19-4 for llo
fuII synlax of aII llo cIausos and llo somanlics of llis slalomonl.
select::=
suoquery_laclor|rg_c|ause
suoquery
lor_updale_c|ause
;
Creal|rg S|rp|e 0uer|es
9-2 Oracle Database SQL Language Reference
subquery::=
query_block::=
6reat|ng $|mp|e 0uer|es
Tlo Iisl of oxprossions llal appoars aflor llo SFLFCT Ioyvord and boforo llo FROM
cIauso is caIIod llo seIect Iist. Willin llo soIocl Iisl, you spocify ono or moro coIumns
in llo sol of rovs you vanl OracIo Dalabaso lo rolurn from ono or moro labIos, viovs,
or maloriaIizod viovs. Tlo numbor of coIumns, as voII as lloir dala lypo and Iongll,
aro dolorminod by llo oIomonls of llo soIocl Iisl.
If lvo or moro labIos lavo somo coIumn namos in common, llon you musl quaIify
coIumn namos vill namos of labIos. Ollorviso, fuIIy quaIifiod coIumn namos aro
oplionaI. Hovovor, il is aIvays a good idoa lo quaIify labIo and coIumn roforoncos
oxpIicilIy. OracIo oflon doos Ioss vorI vill fuIIy quaIifiod labIo and coIumn namos.
You can uso a coIumn aIias, c_alias, lo IaboI llo immodialoIy procoding oxprossion
in llo soIocl Iisl so llal llo coIumn is dispIayod vill a nov loading. Tlo aIias
offoclivoIy ronamos llo soIocl Iisl ilom for llo duralion of llo quory. Tlo aIias can bo
usod in llo ORDFR BY cIauso, bul nol ollor cIausos in llo quory.
You can uso commonls in a SFLFCT slalomonl lo pass inslruclions, or hints, lo llo
OracIo Dalabaso oplimizor. Tlo oplimizor usos linls lo clooso an oxoculion pIan for
llo slalomonl. Rofor lo "Hinls" on pago 3-74 for moro informalion on linls.
query_o|oc|
suoquery
u|l0|
ALL
l|TERSECT
Vl|uS
suoquery
( suoquery )
order_oy_c|ause
SELECT
||rl
0lSTl|CT
u|l0uE
ALL
se|ecl_||sl
FR0V
lao|e_relererce
jo|r_c|ause
( jo|r_c|ause )
,
W|ere_c|ause ||erarc||ca|_query_c|ause group_oy_c|ause
rode|_c|ause
l|erarc||ca| 0uer|es
SQL Queries and Subqueries 9-3
h|erarch|ca| 0uer|es
If a labIo conlains liorarclicaI dala, llon you can soIocl rovs in a liorarclicaI ordor
using llo liorarclicaI quory cIauso:
hierarchical_query_clause::=
START WITH spocifios llo rool rov(s) of llo liorarcly.
CONNFCT BY spocifios llo roIalionslip bolvoon paronl rovs and cliId rovs of llo
liorarcly.
Tlo NOCYCLF paramolor inslrucls OracIo Dalabaso lo rolurn rovs from a quory
ovon if a CONNFCT BY Ioop oxisls in llo dala. Uso llis paramolor aIong vill llo
CONNFCT_BY_ISCYCLF psoudocoIumn lo soo vlicl rovs conlain llo Ioop. Rofor
lo CONNICT_BY_ISCYCII IsoudocoIumn on pago 2-1 for moro informalion.
In a liorarclicaI quory, ono oxprossion in condition musl bo quaIifiod vill llo
PRIOR oporalor lo rofor lo llo paronl rov. Ior oxampIo,
... PRIOR expr = expr
or
... expr = PRIOR expr
If llo CONNFCT BY condition is compound, llon onIy ono condilion roquiros llo
PRIOR oporalor, aIllougl you can lavo muIlipIo PRIOR condilions. Ior oxampIo:
CONNFCT BY last_name != 'King' AND PRIOR emploee_id = manager_id ...
CONNFCT BY PRIOR emploee_id = manager_id and
PRIOR account_mgr_id = customer_id ...
PRIOR is a unary oporalor and las llo samo procodonco as llo unary + and -
arillmolic oporalors. Il ovaIualos llo immodialoIy foIIoving oxprossion for llo
paronl rov of llo curronl rov in a liorarclicaI quory.
PRIOR is mosl commonIy usod vlon comparing coIumn vaIuos vill llo oquaIily
oporalor. (Tlo PRIOR Ioyvord can bo on oillor sido of llo oporalor.) PRIOR
causos OracIo lo uso llo vaIuo of llo paronl rov in llo coIumn. Oporalors ollor
llan llo oquaI sign (=) aro lloorolicaIIy possibIo in CONNFCT BY cIausos. Hovovor,
llo condilions croalod by lloso ollor oporalors can rosuIl in an infinilo Ioop
llrougl llo possibIo combinalions. In llis caso OracIo dolocls llo Ioop al run limo
and rolurns an orror.
Boll llo CONNFCT BY condilion and llo PRIOR oxprossion can laIo llo form of an
uncorroIalod subquory. Hovovor, CURRVAL and NFXTVAL aro nol vaIid PRIOR
oxprossions, so llo PRIOR oxprossion cannol rofor lo a soquonco.
You can furllor rofino a liorarclicaI quory by using llo CONNFCT_BY_ROOT oporalor
lo quaIify a coIumn in llo soIocl Iisl. Tlis oporalor oxlonds llo funclionaIily of llo
CONNFCT BY |PRIOR] condilion of liorarclicaI quorios by rolurning nol onIy llo
immodialo paronl rov bul aII ancoslor rovs in llo liorarcly.
C0||ECT 6Y
|0CYCLE
cord|l|or
A|0
START wlTl cord|l|or
START wlTl cord|l|or C0||ECT 6Y
|0CYCLE
cord|l|or
A|0
l|erarc||ca| 0uer|es
9-4 Oracle Database SQL Language Reference
OracIo procossos liorarclicaI quorios as foIIovs:
A join, if prosonl, is ovaIualod firsl, vlollor llo join is spocifiod in llo FROM cIauso
or vill WHFRF cIauso prodicalos.
Tlo CONNFCT BY condilion is ovaIualod.
Any romaining WHFRF cIauso prodicalos aro ovaIualod.
OracIo llon usos llo informalion from lloso ovaIualions lo form llo liorarcly using
llo foIIoving slops:
1. OracIo soIocls llo rool rov(s) of llo liorarclylloso rovs llal salisfy llo START
WITH condilion.
2. OracIo soIocls llo cliId rovs of oacl rool rov. Iacl cliId rov musl salisfy llo
condilion of llo CONNFCT BY condilion vill rospocl lo ono of llo rool rovs.
3. OracIo soIocls succossivo gonoralions of cliId rovs. OracIo firsl soIocls llo cliIdron
of llo rovs rolurnod in slop 2, and llon llo cliIdron of lloso cliIdron, and so on.
OracIo aIvays soIocls cliIdron by ovaIualing llo CONNFCT BY condilion vill
rospocl lo a curronl paronl rov.
4. If llo quory conlains a WHFRF cIauso villoul a join, llon OracIo oIiminalos aII
rovs from llo liorarcly llal do nol salisfy llo condilion of llo WHFRF cIauso.
OracIo ovaIualos llis condilion for oacl rov individuaIIy, rallor llan romoving aII
llo cliIdron of a rov llal doos nol salisfy llo condilion.
5. OracIo rolurns llo rovs in llo ordor slovn in Iiguro 91. In llo diagram, cliIdron
appoar boIov lloir paronls. Ior an oxpIanalion of liorarclicaI lroos, soo Iiguro 21,
"HiorarclicaI Troo" on pago 2-3.
Figure 91 Hierarchical Queries
To find llo cliIdron of a paronl rov, OracIo ovaIualos llo PRIOR oxprossion of llo
CONNFCT BY condilion for llo paronl rov and llo ollor oxprossion for oacl rov in llo
labIo. Rovs for vlicl llo condilion is lruo aro llo cliIdron of llo paronl. Tlo CONNFCT
BY condilion can conlain ollor condilions lo furllor fiIlor llo rovs soIoclod by llo
quory.
If llo CONNFCT BY condilion rosuIls in a Ioop in llo liorarcly, llon OracIo rolurns an
orror. A Ioop occurs if ono rov is boll llo paronl (or grandparonl or dirocl ancoslor)
and a cliId (or a grandcliId or a dirocl doscondonl) of anollor rov.
See AIso: CONNICT_BY_ROOT on pago 4-5 for moro informalion
aboul llis oporalor and "HiorarclicaI Quory IxampIos" on pago 9-5
1
7
8
ROOT
2 9
3 4 10 12
11 6 5
l|erarc||ca| 0uer|es
SQL Queries and Subqueries 9-5
h|erarch|ca| 0uery Examp|es
CONNECT BY ExampIe Tlo foIIoving liorarclicaI quory usos llo CONNFCT BY
cIauso lo dofino llo roIalionslip bolvoon ompIoyoos and managors:
SFLFCT emploee_id, last_name, manager_id
FROM emploees
CONNFCT BY PRIOR emploee_id = manager_id;
FMPLOYFF_ID LAST_NAMF MANAGFR_ID
----------- ------------------------- ----------
101 Kochhar 100
108 Greenberg 101
109 Faviet 108
110 Chen 108
111 Sciarra 108
112 Urman 108
112 Popp 108
200 Whalen 101
202 Mavris 101
204 Baer 101
. . .
LEVEL ExampIe Tlo noxl oxampIo is simiIar lo llo procoding oxampIo, bul usos llo
LFVFL psoudocoIumn lo slov paronl and cliId rovs:
SFLFCT emploee_id, last_name, manager_id, LFVFL
FROM emploees
CONNFCT BY PRIOR emploee_id = manager_id;
FMPLOYFF_ID LAST_NAMF MANAGFR_ID LFVFL
----------- ------------------------- ---------- ----------
101 Kochhar 100 1
108 Greenberg 101 2
109 Faviet 108 2
110 Chen 108 2
111 Sciarra 108 2
112 Urman 108 2
112 Popp 108 2
200 Whalen 101 2
202 Mavris 101 2
204 Baer 101 2
205 Higgins 101 2
206 Gietz 205 2
102 De Haan 100 1
...
START WITH ExampIes Tlo noxl oxampIo adds a START WITH cIauso lo spocify a
rool rov for llo liorarcly and an ORDFR BY cIauso using llo SIBLINGS Ioyvord lo
prosorvo ordoring villin llo liorarcly:
SFLFCT last_name, emploee_id, manager_id, LFVFL
Note: In a liorarclicaI quory, do nol spocify oillor ORDFR BY or
GROUP BY, as lloy viII ovorrido llo liorarclicaI ordor of llo CONNFCT
BY rosuIls. If you vanl lo ordor rovs of sibIings of llo samo paronl,
llon uso llo ORDFR SIBLINGS BY cIauso. Soo cr!cr_|_c|cusc on
pago 19-33.
l|erarc||ca| 0uer|es
9-6 Oracle Database SQL Language Reference
FROM emploees
START WITH emploee_id = 100
CONNFCT BY PRIOR emploee_id = manager_id
ORDFR SIBLINGS BY last_name;
LAST_NAMF FMPLOYFF_ID MANAGFR_ID LFVFL
------------------------- ----------- ---------- ----------
King 100 1
Cambrault 148 100 2
Bates 172 148 2
Bloom 169 148 2
Fox 170 148 2
Kumar 172 148 2
Ozer 168 148 2
Smith 171 148 2
De Haan 102 100 2
Hunold 102 102 2
Austin 105 102 4
Frnst 104 102 4
Lorentz 107 102 4
Pataballa 106 102 4
Frrazuriz 147 100 2
Ande 166 147 2
Banda 167 147 2
...
In llo hr.emploees labIo, llo ompIoyoo Slovon King is llo load of llo company
and las no managor. Among lis ompIoyoos is }oln RussoII, vlo is llo managor of
doparlmonl 80. If you updalo llo emploees labIo lo sol RussoII as King's managor,
you croalo a Ioop in llo dala:
UPDATF emploees SFT manager_id = 145
WHFRF emploee_id = 100;
SFLFCT last_name Fmploee,
LFVFL, SYS_CONNFCT_BY_PATH(last_name, '/') Path
FROM emploees
WHFRF level <= 2 AND department_id = 80
START WITH last_name = 'King'
CONNFCT BY PRIOR emploee_id = manager_id AND LFVFL <= 4;
FRROR:
ORA-01426: CONNFCT BY loop in user data
Tlo NOCYCLF paramolor in llo CONNFCT BY condilion causos OracIo lo rolurn llo
rovs in spilo of llo Ioop. Tlo CONNFCT_BY_ISCYCLF psoudocoIumn slovs you
vlicl rovs conlain llo cycIo:
SFLFCT last_name Fmploee, CONNFCT_BY_ISCYCLF Ccle,
LFVFL, SYS_CONNFCT_BY_PATH(last_name, '/') Path
FROM emploees
WHFRF level <= 2 AND department_id = 80
START WITH last_name = 'King'
CONNFCT BY NOCYCLF PRIOR emploee_id = manager_id AND LFVFL <= 4
ORDFR BY Fmploee, Ccle, LFVFL, Path;
Fmploee Ccle LFVFL Path
------------------------- ---------- ---------- -------------------------
Abel 0 2 /King/Zlotke/Abel
Ande 0 2 /King/Frrazuriz/Ande
Banda 0 2 /King/Frrazuriz/Banda
l|erarc||ca| 0uer|es
SQL Queries and Subqueries 9-7
Bates 0 2 /King/Cambrault/Bates
Bernstein 0 2 /King/Russell/Bernstein
Bloom 0 2 /King/Cambrault/Bloom
Cambrault 0 2 /King/Cambrault
Cambrault 0 2 /King/Russell/Cambrault
Doran 0 2 /King/Partners/Doran
Frrazuriz 0 2 /King/Frrazuriz
Fox 0 2 /King/Cambrault/Fox
...
CONNECT_BY_ISLEAF ExampIe Tlo foIIoving slalomonl slovs lov you can uso a
liorarclicaI quory lo lurn llo vaIuos in a coIumn inlo a comma-doIimilod Iisl:
SFLFCT LTRIM(SYS_CONNFCT_BY_PATH (warehouse_id,','),',') FROM
(SFLFCT ROWNUM r, warehouse_id FROM warehouses)
WHFRF CONNFCT_BY_ISLFAF = 1
START WITH r = 1
CONNFCT BY r = PRIOR r + 1
ORDFR BY warehouse_id;
LTRIM(SYS_CONNFCT_BY_PATH(WARFHOUSF_ID,','),',')
--------------------------------------------------------------------------------
1,2,2,4,5,6,7,8,9
CONNECT_BY_ROOT ExampIes Tlo foIIoving oxampIo rolurns llo Iasl namo of
oacl ompIoyoo in doparlmonl 110, oacl managor abovo llal ompIoyoo in llo liorarcly,
llo numbor of IovoIs bolvoon managor and ompIoyoo, and llo pall bolvoon llo lvo:
SFLFCT last_name Fmploee, CONNFCT_BY_ROOT last_name Manager,
LFVFL-1 Pathlen, SYS_CONNFCT_BY_PATH(last_name, '/') Path
FROM emploees
WHFRF LFVFL > 1 and department_id = 110
CONNFCT BY PRIOR emploee_id = manager_id
ORDFR BY Fmploee, Manager, Pathlen, Path;
Fmploee Manager Pathlen Path
--------------- --------------- ---------- ------------------------------
Gietz Higgins 1 /Higgins/Gietz
Gietz King 2 /King/Kochhar/Higgins/Gietz
Gietz Kochhar 2 /Kochhar/Higgins/Gietz
Higgins King 2 /King/Kochhar/Higgins
Higgins Kochhar 1 /Kochhar/Higgins
Tlo foIIoving oxampIo usos a GROUP BY cIauso lo rolurn llo lolaI saIary of oacl
ompIoyoo in doparlmonl 110 and aII ompIoyoos boIov llal ompIoyoo in llo liorarcly:
SFLFCT name, SUM(salar) Total_Salar FROM (
SFLFCT CONNFCT_BY_ROOT last_name as name, Salar
FROM emploees
WHFRF department_id = 110
CONNFCT BY PRIOR emploee_id = manager_id)
GROUP BY name
ORDFR BY name, Total_Salar;
NAMF Total_Salar
------------------------- ------------
Gietz 8200
Higgins 20200
King 20200
Kochhar 20200
T|e u|l0| [ALL|, l|TERSECT, Vl|uS 0peralors
9-8 Oracle Database SQL Language Reference
The uN|0N [ALL}, |NTEP$E6T, H|Nu$ 0perators
You can combino muIlipIo quorios using llo sol oporalors UNION, UNION ALL,
INTFRSFCT, and MINUS. AII sol oporalors lavo oquaI procodonco. If a SQI slalomonl
conlains muIlipIo sol oporalors, llon OracIo Dalabaso ovaIualos llom from llo Iofl lo
rigll unIoss paronllosos oxpIicilIy spocify anollor ordor.
Tlo corrosponding oxprossions in llo soIocl Iisls of llo compononl quorios of a
compound quory musl malcl in numbor and musl bo in llo samo dala lypo group
(sucl as numoric or claraclor).
If compononl quorios soIocl claraclor dala, llon llo dala lypo of llo rolurn vaIuos aro
dolorminod as foIIovs:
If boll quorios soIocl vaIuos of dala lypo CHAR of oquaI Iongll, llon llo rolurnod
vaIuos lavo dala lypo CHAR of llal Iongll. If llo quorios soIocl vaIuos of CHAR
vill difforonl Ionglls, llon llo rolurnod vaIuo is VARCHAR2 vill llo Iongll of llo
Iargor CHAR vaIuo.
If oillor or boll of llo quorios soIocl vaIuos of dala lypo VARCHAR2, llon llo
rolurnod vaIuos lavo dala lypo VARCHAR2.
If compononl quorios soIocl numoric dala, llon llo dala lypo of llo rolurn vaIuos is
dolorminod by numoric procodonco:
If any quory soIocls vaIuos of lypo BINARY_DOUBLF, llon llo rolurnod vaIuos
lavo dala lypo BINARY_DOUBLF.
If no quory soIocls vaIuos of lypo BINARY_DOUBLF bul any quory soIocls vaIuos of
lypo BINARY_FLOAT, llon llo rolurnod vaIuos lavo dala lypo BINARY_FLOAT.
If aII quorios soIocl vaIuos of lypo NUMBFR, llon llo rolurnod vaIuos lavo dala lypo
NUMBFR.
In quorios using sol oporalors, OracIo doos nol porform impIicil convorsion across dala
lypo groups. Tloroforo, if llo corrosponding oxprossions of compononl quorios rosoIvo
lo boll claraclor dala and numoric dala, OracIo rolurns an orror.
ExampIes Tlo foIIoving quory is vaIid:
See AIso:
IIVII IsoudocoIumn on pago 2-2 and CONNICT_BY_ISCYCII
IsoudocoIumn on pago 2-1 for a discussion of lov lloso
psoudocoIumns oporalo in a liorarclicaI quory
SYS_CONNICT_BY_IATH on pago 5-201 for informalion on
rolrioving llo pall of coIumn vaIuos from rool lo nodo
cr!cr_|_c|cusc on pago 19-33 for moro informalion on llo
SIBLINGS Ioyvord of ORDFR BY cIausos
su|ucr_|ccicring_c|cusc on pago 19-13, vlicl supporls rocursivo
subquory facloring (rocursivo WITH) and Iols you quory
liorarclicaI dala. Tlis foaluro is moro povorfuI llan CONNFCT BY
in llal il providos dopll-firsl soarcl and broadll-firsl soarcl, and
supporls muIlipIo rocursivo branclos.
See AIso: TabIo 310, " ImpIicil Typo Convorsion Malrix" on
pago 3-41 for moro informalion on impIicil convorsion and "Numoric
Irocodonco" on pago 3-14 for informalion on numoric procodonco
T|e u|l0| [ALL|, l|TERSECT, Vl|uS 0peralors
SQL Queries and Subqueries 9-9
SFLFCT 2 FROM DUAL
INTFRSFCT
SFLFCT 2f FROM DUAL;
Tlis is impIicilIy convorlod lo llo foIIoving compound quory:
SFLFCT TO_BINARY_FLOAT(2) FROM DUAL
INTFRSFCT
SFLFCT 2f FROM DUAL;
Tlo foIIoving quory rolurns an orror:
SFLFCT '2' FROM DUAL
INTFRSFCT
SFLFCT 2f FROM DUAL;
Restrictions on the Set Operators Tlo sol oporalors aro subjocl lo llo foIIoving
roslriclions:
Tlo sol oporalors aro nol vaIid on coIumns of lypo BLOB, CLOB, BFILF, VARRAY,
or noslod labIo.
Tlo UNION, INTFRSFCT, and MINUS oporalors aro nol vaIid on LONG coIumns.
If llo soIocl Iisl procoding llo sol oporalor conlains an oxprossion, llon you musl
provido a coIumn aIias for llo oxprossion in ordor lo rofor lo il in llo order_by_
clause.
You cannol aIso spocify llo for_update_clause vill llo sol oporalors.
You cannol spocify llo order_by_clause in llo subquery of lloso oporalors.
You cannol uso lloso oporalors in SFLFCT slalomonls conlaining TABLF coIIoclion
oxprossions.
UNION ExampIe Tlo foIIoving slalomonl combinos llo rosuIls of lvo quorios vill
llo UNION oporalor, vlicl oIiminalos dupIicalo soIoclod rovs. Tlis slalomonl slovs
llal you musl malcl dala lypo (using llo TO_CHAR funclion) vlon coIumns do nol
oxisl in ono or llo ollor labIo:
SFLFCT location_id, department_name Department,
TO_CHAR(NULL) Warehouse FROM departments
UNION
SFLFCT location_id, TO_CHAR(NULL) Department, warehouse_name
FROM warehouses;
LOCATION_ID Department Warehouse
----------- ------------------------------ ---------------------------
1400 IT
1400 Southlake, Texas
1500 Shipping
1500 San Francisco
1600 New erse
1700 Accounting
1700 Administration
Note: To compIy vill omorging SQI slandards, a fuluro roIoaso of
OracIo viII givo llo INTFRSFCT oporalor groalor procodonco llan llo
ollor sol oporalors. Tloroforo, you slouId uso paronllosos lo spocify
ordor of ovaIualion in quorios llal uso llo INTFRSFCT oporalor vill
ollor sol oporalors.
Sorl|rg 0uery Resu|ls
9-10 Oracle Database SQL Language Reference
1700 Benefits
1700 Construction
1700 Contracting
1700 Control And Credit
...
UNION ALL ExampIe Tlo UNION oporalor rolurns onIy dislincl rovs llal appoar in
oillor rosuIl, vliIo llo UNION ALL oporalor rolurns aII rovs. Tlo UNION ALL oporalor
doos nol oIiminalo dupIicalo soIoclod rovs:
SFLFCT product_id FROM order_items
UNION
SFLFCT product_id FROM inventories
ORDFR BY product_id;
SFLFCT location_id FROM locations
UNION ALL
SFLFCT location_id FROM departments
ORDFR BY location_id;
A location_id vaIuo llal appoars muIlipIo limos in oillor or boll quorios (sucl as
'1700') is rolurnod onIy onco by llo UNION oporalor, bul muIlipIo limos by llo UNION
ALL oporalor.
INTERSECT ExampIe Tlo foIIoving slalomonl combinos llo rosuIls vill llo
INTFRSFCT oporalor, vlicl rolurns onIy lloso uniquo rovs rolurnod by boll quorios:
SFLFCT product_id FROM inventories
INTFRSFCT
SFLFCT product_id FROM order_items
ORDFR BY product_id;
MINUS ExampIe Tlo foIIoving slalomonl combinos rosuIls vill llo MINUS oporalor,
vlicl rolurns onIy uniquo rovs rolurnod by llo firsl quory bul nol by llo socond:
SFLFCT product_id FROM inventories
MINUS
SFLFCT product_id FROM order_items
ORDFR BY product_id;
$ort|ng 0uery Pesu|ts
Uso llo ORDFR BY cIauso lo ordor llo rovs soIoclod by a quory. Sorling by posilion is
usofuI in llo foIIoving casos:
To ordor by a Ionglly soIocl Iisl oxprossion, you can spocify ils posilion in llo
ORDFR BY cIauso rallor llan dupIicalo llo onliro oxprossion.
Ior compound quorios conlaining sol oporalors UNION, INTFRSFCT, MINUS, or
UNION ALL, llo ORDFR BY cIauso musl spocify posilions or aIiasos rallor llan
oxpIicil oxprossions. AIso, llo ORDFR BY cIauso can appoar onIy in llo Iasl
compononl quory. Tlo ORDFR BY cIauso ordors aII rovs rolurnod by llo onliro
compound quory.
Tlo moclanism by vlicl OracIo Dalabaso sorls claraclor vaIuos for llo ORDFR BY
cIauso, aIso Inovn as llo coIIalion, is spocifiod by llo NLS_SORT sossion paramolor. If
llis paramolor is nol sol, llon ils dofauIl is dorivod from llo NLS_LANGUAGF sossion
paramolor. You can clango llo coIIalion dynamicaIIy using llo ALTFR SFSSION SFT
NLS_SORT slalomonl. You can aIso appIy a spocific coIIalion by incIuding llo claraclor
Jo|rs
SQL Queries and Subqueries 9-11
oxprossions lo bo sorlod as argumonls lo llo NLSSORT funclion, vill llo coIIalion
spocifiod in llo socond paramolor.
Wlon claraclor vaIuos aro comparod IinguislicaIIy for llo ORDFR BY cIauso, lloy aro
firsl lransformod lo coIIalion Ioys and llon comparod IiIo RAW vaIuos. Tlo coIIalion
Ioys aro gonoralod oillor oxpIicilIy as spocifiod in NLSSORT or impIicilIy using llo
samo mollod llal NLSSORT usos. Boll oxpIicilIy and impIicilIy gonoralod coIIalion
Ioys aro subjocl lo llo samo roslriclions llal aro doscribod in "NISSORT" on
pago 5-120. As a rosuIl of lloso roslriclions, lvo vaIuos may comparo as IinguislicaIIy
oquaI if lloy do nol diffor in llo profix llal vas usod lo produco llo coIIalion Ioy, ovon
if lloy diffor in llo rosl of llo vaIuo.
Jo|ns
A jnin is a quory llal combinos rovs from lvo or moro labIos, viovs, or maloriaIizod
viovs. OracIo Dalabaso porforms a join vlonovor muIlipIo labIos appoar in llo FROM
cIauso of llo quory. Tlo soIocl Iisl of llo quory can soIocl any coIumns from any of
lloso labIos. If any lvo of lloso labIos lavo a coIumn namo in common, llon you musl
quaIify aII roforoncos lo lloso coIumns llrougloul llo quory vill labIo namos lo avoid
ambiguily.
Jo|n 6ond|t|ons
Mosl join quorios conlain al Ioasl ono jnin cnnditinn, oillor in llo FROM cIauso or in
llo WHFRF cIauso. Tlo join condilion comparos lvo coIumns, oacl from a difforonl
labIo. To oxoculo a join, OracIo Dalabaso combinos pairs of rovs, oacl conlaining ono
rov from oacl labIo, for vlicl llo join condilion ovaIualos lo TRUF. Tlo coIumns in
llo join condilions nood nol aIso appoar in llo soIocl Iisl.
To oxoculo a join of llroo or moro labIos, OracIo firsl joins lvo of llo labIos basod on
llo join condilions comparing lloir coIumns and llon joins llo rosuIl lo anollor labIo
basod on join condilions conlaining coIumns of llo joinod labIos and llo nov labIo.
OracIo conlinuos llis procoss unliI aII labIos aro joinod inlo llo rosuIl. Tlo oplimizor
dolorminos llo ordor in vlicl OracIo joins labIos basod on llo join condilions, indoxos
on llo labIos, and, any avaiIabIo slalislics for llo labIos.
A WHFRF cIauso llal conlains a join condilion can aIso conlain ollor condilions llal
rofor lo coIumns of onIy ono labIo. Tloso condilions can furllor roslricl llo rovs
rolurnod by llo join quory.
Equ|[o|ns
An equijnin is a join vill a join condilion conlaining an oquaIily oporalor. An oquijoin
combinos rovs llal lavo oquivaIonl vaIuos for llo spocifiod coIumns. Doponding on
llo inlornaI aIgorillm llo oplimizor cloosos lo oxoculo llo join, llo lolaI sizo of llo
coIumns in llo oquijoin condilion in a singIo labIo may bo Iimilod lo llo sizo of a dala
bIocI minus somo ovorload. Tlo sizo of a dala bIocI is spocifiod by llo iniliaIizalion
paramolor DB_BLOCK_SIZF.
See AIso: NISSORT on pago 5-120 and Orcc|c Dcic|csc G|c|c|izciicn
Suppcri Gui!c for informalion on llo NIS paramolors
Note: You cannol spocify IOB coIumns in llo WHFRF cIauso if llo
WHFRF cIauso conlains llo join condilion. Tlo uso of IOBs in WHFRF
cIausos is aIso subjocl lo ollor roslriclions. Soo Orcc|c Dcic|csc
SccurcIi|cs cn! Icrgc O|jccis Dctc|cpcrs Gui!c for moro informalion.
Jo|rs
9-12 Oracle Database SQL Language Reference
$e|f Jo|ns
A seII jnin is a join of a labIo lo ilsoIf. Tlis labIo appoars lvico in llo FROM cIauso and
is foIIovod by labIo aIiasos llal quaIify coIumn namos in llo join condilion. To
porform a soIf join, OracIo Dalabaso combinos and rolurns rovs of llo labIo llal salisfy
llo join condilion.
6artes|an Products
If lvo labIos in a join quory lavo no join condilion, llon OracIo Dalabaso rolurns lloir
Cartesian prnduct. OracIo combinos oacl rov of ono labIo vill oacl rov of llo ollor.
A Carlosian producl aIvays gonoralos many rovs and is raroIy usofuI. Ior oxampIo,
llo Carlosian producl of lvo labIos, oacl vill 100 rovs, las 10,000 rovs. AIvays
incIudo a join condilion unIoss you spocificaIIy nood a Carlosian producl. If a quory
joins llroo or moro labIos and you do nol spocify a join condilion for a spocific pair,
llon llo oplimizor may clooso a join ordor llal avoids producing an inlormodialo
Carlosian producl.
|nner Jo|ns
An inner jnin (somolimos caIIod a simpIe jnin) is a join of lvo or moro labIos llal
rolurns onIy lloso rovs llal salisfy llo join condilion.
0uter Jo|ns
An nuter jnin oxlonds llo rosuIl of a simpIo join. An oulor join rolurns aII rovs llal
salisfy llo join condilion and aIso rolurns somo or aII of lloso rovs from ono labIo for
vlicl no rovs from llo ollor salisfy llo join condilion.
To vrilo a quory llal porforms an oulor join of labIos A and B and rolurns aII rovs
from A (a IeIt nuter jnin), uso llo LFFT |OUTFR] OIN synlax in llo FROM cIauso,
or appIy llo oulor join oporalor (+) lo aII coIumns of B in llo join condilion in llo
WHFRF cIauso. Ior aII rovs in A llal lavo no malcling rovs in B, OracIo Dalabaso
rolurns nuII for any soIocl Iisl oxprossions conlaining coIumns of B.
To vrilo a quory llal porforms an oulor join of labIos A and B and rolurns aII rovs
from B (a right nuter jnin), uso llo RIGHT |OUTFR] OIN synlax in llo FROM
cIauso, or appIy llo oulor join oporalor (+) lo aII coIumns of A in llo join condilion
in llo WHFRF cIauso. Ior aII rovs in B llal lavo no malcling rovs in A, OracIo
rolurns nuII for any soIocl Iisl oxprossions conlaining coIumns of A.
To vrilo a quory llal porforms an oulor join and rolurns aII rovs from A and B,
oxlondod vill nuIIs if lloy do nol salisfy llo join condilion (a IuII nuter jnin), uso
llo FULL |OUTFR] OIN synlax in llo FROM cIauso.
You cannol comparo a coIumn vill a subquory in llo WHFRF cIauso of any oulor join,
rogardIoss vlicl form you spocify.
You can uso oulor joins lo fiII gaps in sparso dala. Sucl a join is caIIod a partitinned
nuter jnin and is formod using llo query_partition_clause of llo join_clause
synlax. Sparso dala is dala llal doos nol lavo rovs for aII possibIo vaIuos of a
dimonsion sucl as limo or doparlmonl. Ior oxampIo, labIos of saIos dala lypicaIIy do
nol lavo rovs for producls llal lad no saIos on a givon dalo. IiIIing dala gaps is
See AIso: "Using }oin Quorios: IxampIos" on pago 19-49
See AIso: "Using SoIf }oins: IxampIo" on pago 19-50
Jo|rs
SQL Queries and Subqueries 9-13
usofuI in silualions vloro dala sparsily compIicalos anaIylic compulalion or vloro
somo dala migll bo missod if llo sparso dala is quoriod diroclIy.
OracIo rocommonds llal you uso llo FROM cIauso OUTFR OIN synlax rallor llan llo
OracIo join oporalor. Oulor join quorios llal uso llo OracIo join oporalor (+) aro subjocl
lo llo foIIoving ruIos and roslriclions, vlicl do nol appIy lo llo FROM cIauso OUTFR
OIN synlax:
You cannol spocify llo (+) oporalor in a quory bIocI llal aIso conlains FROM cIauso
join synlax.
Tlo (+) oporalor can appoar onIy in llo WHFRF cIauso or, in llo conloxl of
Iofl-corroIalion (vlon spocifying llo TABLF cIauso) in llo FROM cIauso, and can bo
appIiod onIy lo a coIumn of a labIo or viov.
If A and B aro joinod by muIlipIo join condilions, llon you musl uso llo (+)
oporalor in aII of lloso condilions. If you do nol, llon OracIo Dalabaso viII rolurn
onIy llo rovs rosuIling from a simpIo join, bul villoul a varning or orror lo
adviso you llal you do nol lavo llo rosuIls of an oulor join.
Tlo (+) oporalor doos nol produco an oulor join if you spocify ono labIo in llo
oulor quory and llo ollor labIo in an innor quory.
You cannol uso llo (+) oporalor lo oulor-join a labIo lo ilsoIf, aIllougl soIf joins aro
vaIid. Ior oxampIo, llo foIIoving slalomonl is nnt vaIid:
-- The following statement is not valid:
SFLFCT emploee_id, manager_id
FROM emploees
WHFRF emploees.manager_id(+) = emploees.emploee_id;
Hovovor, llo foIIoving soIf join is vaIid:
SFLFCT e1.emploee_id, e1.manager_id, e2.emploee_id
FROM emploees e1, emploees e2
WHFRF e1.manager_id(+) = e2.emploee_id
ORDFR BY e1.emploee_id, e1.manager_id, e2.emploee_id;
Tlo (+) oporalor can bo appIiod onIy lo a coIumn, nol lo an arbilrary oxprossion.
Hovovor, an arbilrary oxprossion can conlain ono or moro coIumns marIod vill
llo (+) oporalor.
A WHFRF condilion conlaining llo (+) oporalor cannol bo combinod vill anollor
condilion using llo OR IogicaI oporalor.
A WHFRF condilion cannol uso llo IN comparison condilion lo comparo a coIumn
marIod vill llo (+) oporalor vill an oxprossion.
If llo WHFRF cIauso conlains a condilion llal comparos a coIumn from labIo B vill a
conslanl, llon llo (+) oporalor musl bo appIiod lo llo coIumn so llal OracIo rolurns
llo rovs from labIo A for vlicl il las gonoralod nuIIs for llis coIumn. Ollorviso
OracIo rolurns onIy llo rosuIls of a simpIo join.
In a quory llal porforms oulor joins of moro llan lvo pairs of labIos, a singIo labIo can
bo llo nuII-gonoralod labIo for onIy ono ollor labIo. Ior llis roason, you cannol appIy
See AIso:
jcin_c|cusc on pago 19-23 for moro informalion aboul using oulor
joins lo fiII gaps in sparso dala
Orcc|c Dcic|csc Dcic Wcrc|cusing Gui!c for a compIolo discussion
of group oulor joins and fiIIing gaps in sparso dala
us|rg Suoquer|es
9-14 Oracle Database SQL Language Reference
llo (+) oporalor lo coIumns of B in llo join condilion for A and B and llo join
condilion for B and C. Rofor lo SIIICT on pago 19-4 for llo synlax for an oulor join.
Ant|[o|ns
An anlijoin rolurns rovs from llo Iofl sido of llo prodicalo for vlicl lloro aro no
corrosponding rovs on llo rigll sido of llo prodicalo. Il rolurns rovs llal faiI lo malcl
(NOT IN) llo subquory on llo rigll sido.
$em|[o|ns
A somijoin rolurns rovs llal malcl an FXISTS subquory villoul dupIicaling rovs
from llo Iofl sido of llo prodicalo vlon muIlipIo rovs on llo rigll sido salisfy llo
criloria of llo subquory.
Somijoin and anlijoin lransformalion cannol bo dono if llo subquory is on an OR
brancl of llo WHFRF cIauso.
us|ng $ubquer|es
A subquery ansvors muIlipIo-parl quoslions. Ior oxampIo, lo dolormino vlo vorIs in
TayIor's doparlmonl, you can firsl uso a subquory lo dolormino llo doparlmonl in
vlicl TayIor vorIs. You can llon ansvor llo originaI quoslion vill llo paronl
SFLFCT slalomonl. A subquory in llo FROM cIauso of a SFLFCT slalomonl is aIso
caIIod an inIine view. you can nosl any numbor of subquorios in an inIino viov. A
subquory in llo WHFRF cIauso of a SFLFCT slalomonl is aIso caIIod a nested subquery.
You can nosl up lo 255 IovoIs of subquorios in llo a noslod subquory.
A subquory can conlain anollor subquory. OracIo Dalabaso imposos no Iimil on llo
numbor of subquory IovoIs in llo FROM cIauso of llo lop-IovoI quory. You can nosl up
lo 255 IovoIs of subquorios in llo WHFRF cIauso.
If coIumns in a subquory lavo llo samo namo as coIumns in llo conlaining slalomonl,
llon you musl profix any roforonco lo llo coIumn of llo labIo from llo conlaining
slalomonl vill llo labIo namo or aIias. To maIo your slalomonls oasior lo road, aIvays
quaIify llo coIumns in a subquory vill llo namo or aIias of llo labIo, viov, or
maloriaIizod viov.
OracIo porforms a cnrreIated subquery vlon a noslod subquory roforoncos a coIumn
from a labIo roforrod lo a paronl slalomonl any numbor of IovoIs abovo llo subquory.
Tlo paronl slalomonl can bo a SFLFCT, UPDATF, or DFLFTF slalomonl in vlicl llo
subquory is noslod. A corroIalod subquory is ovaIualod onco for oacl rov procossod by
llo paronl slalomonl. OracIo rosoIvos unquaIifiod coIumns in llo subquory by IooIing
in llo labIos namod in llo subquory and llon in llo labIos namod in llo paronl
slalomonl.
A corroIalod subquory ansvors a muIlipIo-parl quoslion vloso ansvor doponds on llo
vaIuo in oacl rov procossod by llo paronl slalomonl. Ior oxampIo, you can uso a
corroIalod subquory lo dolormino vlicl ompIoyoos oarn moro llan llo avorago
saIarios for lloir doparlmonls. In llis caso, llo corroIalod subquory spocificaIIy
compulos llo avorago saIary for oacl doparlmonl.
See AIso: "Using Anlijoins: IxampIo" on pago 19-53
See AIso: "Using Somijoins: IxampIo" on pago 19-53
See AIso: "Using CorroIalod Subquorios: IxampIos" on pago 19-57
urresl|rg ol |esled Suoquer|es
SQL Queries and Subqueries 9-15
Uso subquorios for llo foIIoving purposos:
To dofino llo sol of rovs lo bo insorlod inlo llo largol labIo of an INSFRT or
CRFATF TABLF slalomonl
To dofino llo sol of rovs lo bo incIudod in a viov or maloriaIizod viov in a
CRFATF VIFW or CRFATF MATFRIALIZFD VIFW slalomonl
To dofino ono or moro vaIuos lo bo assignod lo oxisling rovs in an UPDATF
slalomonl
To provido vaIuos for condilions in a WHFRF cIauso, HAVING cIauso, or START
WITH cIauso of SFLFCT, UPDATF, and DFLFTF slalomonls
To dofino a labIo lo bo oporalod on by a conlaining quory
You do llis by pIacing llo subquory in llo FROM cIauso of llo conlaining quory as
you vouId a labIo namo. You may uso subquorios in pIaco of labIos in llis vay as
voII in INSFRT, UPDATF, and DFLFTF slalomonls.
Subquorios so usod can ompIoy corroIalion variabIos, bul onIy lloso dofinod
villin llo subquory ilsoIf, nol oulor roforoncos. Rofor lo ic||c_cc||cciicn_cxprcssicn
on pago 19-20 for moro informalion.
ScaIar subquorios, vlicl rolurn a singIo coIumn vaIuo from a singIo rov, aro a
vaIid form of oxprossion. You can uso scaIar subquory oxprossions in mosl of llo
pIacos vloro expr is caIIod for in synlax. Rofor lo "ScaIar Subquory Ixprossions"
on pago 6-14 for moro informalion.
unnest|ng of Nested $ubquer|es
Subquorios aro nested vlon lloy appoar in llo WHFRF cIauso of llo paronl slalomonl.
Wlon OracIo Dalabaso ovaIualos a slalomonl vill a noslod subquory, il musl ovaIualo
llo subquory porlion muIlipIo limos and may ovorIooI somo officionl accoss palls or
joins.
Subquery unnesting unnosls and morgos llo body of llo subquory inlo llo body of
llo slalomonl llal conlains il, aIIoving llo oplimizor lo considor llom logollor vlon
ovaIualing accoss palls and joins. Tlo oplimizor can unnosl mosl subquorios, vill
somo oxcoplions. Tloso oxcoplions incIudo liorarclicaI subquorios and subquorios llal
conlain a ROWNUM psoudocoIumn, ono of llo sol oporalors, a noslod aggrogalo
funclion, or a corroIalod roforonco lo a quory bIocI llal is nol llo immodialo oulor
quory bIocI of llo subquory.
Assuming no roslriclions oxisl, llo oplimizor aulomalicaIIy unnosls somo (bul nol aII)
of llo foIIoving noslod subquorios:
UncorroIalod IN subquorios
IN and FXISTS corroIalod subquorios, as Iong as lloy do nol conlain aggrogalo
funclions or a GROUP BY cIauso
You can onabIo extended subquery unnesting by inslrucling llo oplimizor lo unnosl
addilionaI lypos of subquorios:
You can unnosl an uncorroIalod NOT IN subquory by spocifying llo HASH_A or
MFRGF_A linl in llo subquory.
You can unnosl ollor subquorios by spocifying llo UNNFST linl in llo subquory.
See AIso: "Hinls" on pago 3-74 for informalion on linls
Se|ecl|rg lror l|e 0uAL Tao|e
9-16 Oracle Database SQL Language Reference
$e|ect|ng from the 0uAL Tab|e
DUAL is a labIo aulomalicaIIy croalod by OracIo Dalabaso aIong vill llo dala
diclionary. DUAL is in llo scloma of llo usor SYS bul is accossibIo by llo namo DUAL lo
aII usors. Il las ono coIumn, DUMMY, dofinod lo bo VARCHAR2(1), and conlains ono
rov vill a vaIuo X. SoIocling from llo DUAL labIo is usofuI for compuling a conslanl
oxprossion vill llo SFLFCT slalomonl. Bocauso DUAL las onIy ono rov, llo conslanl is
rolurnod onIy onco. AIlornalivoIy, you can soIocl a conslanl, psoudocoIumn, or
oxprossion from any labIo, bul llo vaIuo viII bo rolurnod as many limos as lloro aro
rovs in llo labIo. Rofor lo "Aboul SQI Iunclions" on pago 5-2 for many oxampIos of
soIocling a conslanl vaIuo from DUAL.
0|str|buted 0uer|es
Tlo OracIo dislribulod dalabaso managomonl syslom arclilocluro Iols you accoss dala
in romolo dalabasos using Oracle Net and an Oracle Database sorvor. You can
idonlify a romolo labIo, viov, or maloriaIizod viov by apponding dblink lo llo ond
of ils namo. Tlo dblink musl bo a compIolo or parliaI namo for a dalabaso IinI lo llo
dalabaso conlaining llo romolo labIo, viov, or maloriaIizod viov.
Restrictions on Distributed Queries Dislribulod quorios aro curronlIy subjocl lo llo
roslriclion llal aII labIos IocIod by a FOR UPDATF cIauso and aII labIos vill LONG
coIumns soIoclod by llo quory musl bo Iocalod on llo samo dalabaso. In addilion,
OracIo Dalabaso curronlIy doos nol supporl dislribulod quorios llal soIocl
usor-dofinod lypos or objocl RFF dala lypos on romolo labIos.
Note: Boginning vill OracIo Dalabaso 10g RoIoaso 1, IogicaI I/O is
nol porformod on llo DUAL labIo vlon compuling an oxprossion llal
doos nol incIudo llo DUMMY coIumn. Tlis oplimizalion is Iislod as
FAST DUAL in llo oxoculion pIan. If you SFLFCT llo DUMMY coIumn
from DUAL, llon llis oplimizalion doos nol laIo pIaco and IogicaI I/O
occurs.
See AIso:
"Roforoncos lo Objocls in Romolo Dalabasos" on pago 3-116 for
moro informalion on roforring lo dalabaso IinIs
Orcc|c Dcic|csc Nci Scrticcs A!minisircicrs Gui!c for informalion
on accossing romolo dalabasos

You might also like