2013-12-13 37 views
12

Rozejrzałem się za wyjaśnieniem, w jaki sposób działa podzapytanie w oświadczeniu select, a mimo to nie mogę pojąć pojęcia z powodu bardzo niejasnych wyjaśnień.W jaki sposób podkwerenda w instrukcji select działa w wyroczni?

Chciałbym wiedzieć, w jaki sposób używać podzapytanie w instrukcji SELECT w Oracle i co dokładnie robi.

Na przykład, gdybym miał kwerendę, która chciała, aby wyświetlić nazwiska pracowników oraz liczby profili, którymi zarządzają z tych tabel

pracownika (EmpName, EmpID)

profil (ProfileID .. ., EmpId)

Jak używać podzapytania?

Myślałem, że podzapytanie jest potrzebne w instrukcji select, aby zaimplementować grupę według funkcji, aby policzyć liczbę profili zarządzanych dla każdego pracownika, ale nie jestem zbyt pewny.

Odpowiedz

18

To POJEDYNCZY

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

Jest jeszcze prostsze podczas korzystania stół przyłączyć tak:

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; 

wyjaśnienie podzapytaniu:

Zasadniczo podzapytanie w select otrzymuje wartość skalarną i przekazuje go do głównej kwerendy. Podzapytanie w select nie może przejść przez więcej niż jeden wiersz i więcej niż jedną kolumnę, co jest ograniczeniem. Tutaj przekazujemy count do głównej kwerendy, która, jak wiemy, będzie zawsze tylko liczbą - wartością skalarną. Jeśli wartość nie zostanie znaleziona, podkwerenda zwraca null do głównej kwerendy. Co więcej, podzapytanie może uzyskać dostęp do kolumn z klauzuli from głównej zapytania, jak pokazano w moim zapytaniu, gdzie employee.empid jest przekazywane z kwerendy zewnętrznej do kwerendy wewnętrznej.


Edit:

Podczas korzystania podkwerenda w select klauzuli, Oracle zasadniczo traktuje go jako lewej przyłączyć (widać to w explain plan do zapytania), z liczności rzędy są po prostu po prawej stronie dla każdego rzędu po lewej stronie.


Wyjaśnienie dla lewego dołączyć

Lewy przyłączenia jest bardzo przydatny, zwłaszcza gdy chcesz wymienić select podkwerenda powodu jego ograniczeń. Nie ma żadnych ograniczeń dotyczących liczby wierszy tabel po obu stronach słowa kluczowego LEFT JOIN.

Aby uzyskać więcej informacji, przeczytaj Oracle Docs on subqueries i left join or left outer join.

+0

Wielkie dzięki! to naprawdę pomogło. Jedno pytanie. Powiedziałeś, że podzapytanie nie może przekazać więcej niż jednej kolumny, więc oznacza to, że jeśli chcę dodać funkcję SUM, musiałbym użyć innego podzapytania? lub czy można wybrać więcej niż podzapytanie? – user3054901

+0

Tak. Możesz użyć wielu podkwerend na liście wyboru. Będziesz musiał użyć innego podkwerendy do dodania funkcji SUMA. – Rachcha

+0

Dziękujemy za pomoc :) – user3054901

0

W Oracle RDBMS możliwe jest użycie podkwerendy wielu wierszy w klauzuli select, o ile wyjście (pod) jest hermetyzowane jako kolekcja.W szczególności, wielorzędowe podzapytanie klauzuli select może wyświetlać każdy z jego wierszy jako element xml, który jest enkapsulowany w xmlforest.