sql >> Database teknologi >  >> RDS >> Oracle

Hvordan virker underforespørgsel i select statement i oracle

Det er enkelt-

SELECT empname,
       empid,
       (SELECT COUNT (profileid)
          FROM profile
         WHERE profile.empid = employee.empid)
           AS number_of_profiles
  FROM employee;

Det er endnu nemmere, når du bruger en table join som denne:

  SELECT e.empname, e.empid, COUNT (p.profileid) AS number_of_profiles
    FROM employee e LEFT JOIN profile p ON e.empid = p.empid
GROUP BY e.empname, e.empid;

Forklaring på underforespørgslen:

Grundlæggende er en underforespørgsel i en select får en skalarværdi og sender den til hovedforespørgslen. En underforespørgsel i select må ikke passere mere end én række og mere end én kolonne, hvilket er en begrænsning. Her sender vi en count til hovedforespørgslen, der, som vi ved, altid kun ville være et tal - en skalarværdi. Hvis en værdi ikke findes, returnerer underforespørgslen null til hovedforespørgslen. Desuden kan en underforespørgsel få adgang til kolonner fra from klausul i hovedforespørgslen, som vist i min forespørgsel, hvor employee.empid overføres fra den ydre forespørgsel til den indre forespørgsel.

Rediger :

Når du bruger en underforespørgsel i en select klausul, behandler Oracle det i det væsentlige som en venstre joinforbindelse (du kan se dette i forklaringsplanen for din forespørgsel), hvor kardinaliteten af ​​rækkerne kun er én til højre for hver række i venstre.

Forklaring på venstre joinforbindelse

En venstre join er meget praktisk, især når du vil erstatte select underforespørgsel på grund af dens begrænsninger. Der er ingen begrænsninger her på antallet af rækker i tabellerne på begge sider af LEFT JOIN søgeord.

For mere information læs Oracle Docs om underforespørgsler og venstre join eller venstre outer join.



  1. Er PL/SQL-variabler i markører effektivt det samme som bindeparametre?

  2. Hvorfor bruge join i MySQL-forespørgsler i stedet for hvor?

  3. Returner en DML Triggers Type på en tabel i SQL Server

  4. Hvad er meningen med SELECT ... FOR XML PATH(' '),1,1)?