sql >> Database >  >> RDS >> Oracle

Hoe werkt Subquery in select-instructie in Oracle?

Het is eenvoudig-

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

Het is nog eenvoudiger als je een table join als volgt gebruikt:

  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;

Uitleg voor de subquery:

In wezen een subquery in een select krijgt een scalaire waarde en geeft deze door aan de hoofdquery. Een subquery in select mag niet meer dan één rij en meer dan één kolom passeren, wat een beperking is. Hier passeren we een count naar de hoofdquery, die, zoals we weten, altijd alleen een getal zou zijn - een scalaire waarde. Als er geen waarde wordt gevonden, retourneert de subquery null naar de hoofdvraag. Bovendien heeft een subquery toegang tot kolommen van de from clausule van de hoofdquery, zoals getoond in mijn query waar employee.empid wordt doorgegeven van de buitenste vraag naar de binnenste vraag.

Bewerken :

Wanneer u een subquery gebruikt in een select clausule, behandelt Oracle het in wezen als een left join (u kunt dit zien in het uitlegplan voor uw query), waarbij de kardinaliteit van de rijen slechts één aan de rechterkant is voor elke rij aan de linkerkant.

Uitleg voor de linker join

Een left join is erg handig, vooral als je de select . wilt vervangen subquery vanwege de beperkingen. Er zijn hier geen beperkingen voor het aantal rijen van de tabellen aan weerszijden van de LEFT JOIN zoekwoord.

Lees voor meer informatie Oracle Docs over subquery's en left join of left outer join.



  1. Wat zijn de verschillende manieren om gegevens in de SQL Server-tabel in te voegen - SQL Server / TSQL-zelfstudie, deel 100

  2. Records van de afgelopen 24 uur selecteren in PostgreSQL

  3. Uitvoeringstijd van PostgreSQL-query ophalen

  4. Hoe JAR-bestand in Oracle Database te laden?