Subqueries å løse Queries

En delspørring er best definert som en spørring i en spørring. Subqueries gjøre deg i stand til å skrive spørringer som velger datarader for kriterier som faktisk utviklet mens spørringen utfører under kjøring. Mer formelt, er det bruk av en SELECT-setning inne i en av de klausuler av en annen SELECT-setningen. n Faktisk kan en delspørring ligge inni en annen delspørring, som er inne i en annen delspørring, og så videre. En subquery kan også være nestet inne INSERT, UPDATE og DELETE-setninger. Subqueries må vedlegges i parentes.

En subquery kan brukes andre steder hvor et uttrykk er lov å gi den returnerer en enkelt verdi. Dette betyr at en subquery som returnerer en enkelt verdi kan også være oppført som et objekt i et FROM-ledd oppføring. Dette kalles en inline visning fordi når en delspørring brukes som en del av et FROM-ledd, blir den behandlet som en virtuell tabell eller visning. Subquery kan plasseres enten i FROM-leddet, WHERE klausulen eller HAVING av hovedspørringen.

Oracle tillater maksimum hekkende 255 delspørring nivåer i en WHERE-leddet. Det er ingen grense for hekkende subqueries uttrykt i et FROM clause.In praksis er grensen på 255 nivåer egentlig ikke en grense i det hele tatt fordi det er sjelden å møte subqueries nestet utover tre eller fire nivåer.

En delspørring SELECT-setning er svært lik den SELECT-setningen brukes til å starte en vanlig eller ytre query.The komplett syntaksen til en delspørring er:
(VELG [DISTINCT] subquery_select_parameter Fra {table_name | view_name} {table_name | view_name} ... [ ,,,0],HVOR search_conditions] [GROUP BY kolonne [, kolonne] ...] [MED search_conditions])
Typer subqueries

Enkelt Row Sub Query:
Sub spørring som returnerer enkelt rad utgang . De markere bruken av én rad sammenligning operatører, når det brukes i WHERE forhold

Multiple rad sub spørring.
Sub spørring returnerer Multiple Output rad. De gjør bruk av flere sammenligning rad operatører som IN, NOEN, ALL. Det kan være sub-spørringer retur flere kolonner også

korrelert Sub Query.
Korrelerte subqueries avhenge av data fra ytre query.This type subquery inkluderer også subqueries som bruker EXISTS operatøren teste eksistensen av data rader som oppfyller gitte kriterier.

Enkelt Row Sub Query

En enradigt delspørring brukes når resultatene ytre spørringen er er basert på en enkelt, ukjent verdi. Selv om denne spørringstype er formelt kalles "single-rad," navnet tilsier at søket returnerer flere kolonner-men bare én rad med resultater. Imidlertid kan en enkelt rad subquery returnere bare én rad med resultater som består av bare én kolonne til den ytre spørringen.

I nedenfor SELECT spørring, indre SQL returnerer bare én rad dvs. minimum lønn for selskapet. Det i sin tur bruker denne verdien til å sammenligne lønnen til alle ansatte og viser bare de, hvis lønnen er lik minstelønn
SELECT FIRST_NAME, lønn, department_idFROM employeesWHERE lønn = (SELECT MIN (lønn) Fra ansatte).;

En HAVING brukes når gruppe resultatene av en spørring må være begrenset basert på noen tilstand. Hvis en subquery resultatet må sammenlignes med en gruppe funksjon, må du hekker den indre søket i ytre spørringen er å ha klausul.
SELECT department_id, MIN (lønn) Fra employeesGROUP BY department_idHAVING MIN (lønn) < (VELG AVG (lønn) Fra ansatte)

Multiple Row Underkriterier

Multiple-rad subqueries er nestet spørringer som kan returnere mer enn én rad med resultatene til den overordnede spørsmål. Multiple-rad subqueries brukes oftest i WHERE og ha klausuler. Siden den returnerer flere rader, må den håndteres av settet sammenligning operatører (IN, ALLE, NOEN) holder .Mens IN operatør samme betydning som omtalt i tidligere kapittel, sammen NOEN operatør en angitt verdi til hver verdi returneres av sub spørringen mens ALL sammen en verdi for hver returnerte verdien av en sub-spørring.

Nedenfor spørring viser feil når enkelt rad sub søket returnerer flere rader.
SELECT FIRST_NAME, department_idFROM employeesWHERE department_id = (VELG department_id FRA ansatte WHERE LOCATION_ID = 100)
department_id = (select * FEIL på linje 4: ORA-01427: enradigt delspørring returnerer mer enn én rad
Bruk av flere Row operatører

[ ,,,0],> ALL] Mer enn den høyeste verdien som returneres av subquery

[

[ ,,,0],

[> NOE] Mer enn den laveste verdien som returneres av subquery

[ ,,,0],= ALLE] Lik noen verdi returneres av subquery (samme som IN)

Over SQL kan omskrives ved hjelp av IN operatør som nedenfor.
SELECT FIRST_NAME, department_idFROM employeesWHERE department_id IN ( SELECT department_id FRA avdelinger WHERE LOCATION_ID = 100)

Merk i ovennevnte spørringen, kamper i kjøpe IDer returnert fra sub spørring, sammenligner det med at i hovedspørringen og returnerer arbeidstakers navn som tilfredsstiller betingelsen.

A delta ville være bedre løsning for ovenfor spørring, men for illustrasjonens har sub spør blitt brukt i den.

korrelert Sub Query

I motsetning til en vanlig delspørring, hvor den ytre spørring avhenger verdier gitt av indre spørringen, er en korrelert delspørring en der den indre spørringen er avhengig av verdier gitt av ytre spørringen. Dette betyr at i en korrelasjonsdelspørring blir den indre spørringen utføres gjentatte ganger, en gang for hver rad som kan velges av den ytre spørringen.

korrelert subqueries kan produsere resultattabeller som svarer komplekse ledelse spørsmål.

Tenk nedenfor SELECT spørringen. I motsetning til de subqueries tidligere vurdert, kan subquery i denne SELECT-setningen ikke løses uavhengig av hovedspørringen. Legg merke til at den ytre spørringen presiserer at radene er valgt fra arbeidstaker bordet med et alias navn e1. Den indre spørsammen arbeidstakeren avdeling nummer kolonne (DepartmentNumber) av den ansattes bordet med alias e2 til den samme kolonnen for aliaset tabellnavnet e1.
SELECT ansatt_nr, lønn, department_idFROM ansatte EWHERE lønn> (SELECT AVG (lønn) FRA EMP T WHERE E.department_id = T.department_id)
Multiple Column Sub Query

En subquery flere kolonner returnerer mer enn én kolonne til den ytre spørringen og kan bli oppført i den ytre spørringen er fra, hvor, eller HAR klausul. For eksempel viser under spørre den ansattes historiske detaljer for de som har nåværende lønn er innen rekkevidde for 1000 og 2000 og arbeider i avdeling 10 eller 20.
Velg FIRST_NAME, job_id, salaryFROM emp_historyWHERE (lønn, department_id) i (VELG lønn, department_id Fra ansatte DER lønn mellom 1000 og 2000 og department_id MELLOM 10 og 20) ORDER BY FIRST_NAME;

Når en subquery multiple-kolonne brukes i den ytre spørringen FROM-leddet, skaper det en midlertidig tabell som kan refereres til av andre klausuler i ytre spørringen. Denne midlertidige tabellen er mer formelt kalles en inline visning. Den subquery resultater blir behandlet som alle andre bord i FROM-leddet. Hvis den midlertidige tabellen inneholder grupperte data blir gruppert undergrupper behandlet som separate rader med data i en tabell. Tenk FROM-leddet i under søket. Inline visning dannet av delspørringen er datakilden for hovedspørringen
SELECT * FROM (VELG lønn, department_id Fra ansatte DER lønn mellom 1000 og 2000).;