Webinaria: Bazy danych | Ms sql

MS SQL Server Management Studio – CTE i Podzapytania

Udostępnij!

TRANSKRYPCJA:

 

Witam serdecznie, nazywam się Paweł Niemyt i jestem trenerem Altkom Akademii. Chciałbym dzisiaj powiedzieć parę słów o podzapytaniach i CT.

 

Zacznijmy od podzapytań. Na pewno spotkaliśmy się z czymś takim, że tworząc nasze zapytania, używając joinów, querów, havingów, mając na uwadze strukturę naszej bazy, pewnych wyników już nie jesteśmy w stanie osiągnąć ponieważ obojętnie jak byśmy te tabele próbowali połączyć, no to okazuje się, że pewnych rzeczy nie osiągniemy tworząc po prostu zwykłe selecty z joinami.

 

Natomiast można w SQL-u tworzyć podzapytania. Chodzi o to, że możemy najpierw jednym zapytaniem uzyskać pewien rezultat i ten rezultat potraktować też jako punkt wyjścia do tego aby wykonać kolejne zapytania, czyli stworzyć coś a’la taką może wirtualną tabelę; można też oczywiście niestandardowo przy tym rezultacie dać w jakimś warunku, czy nawet zdarza się, możemy dać w insercie, różnie możemy.

 

Sprawa sprowadza się do tego, że możemy tworzyć podzapytania, czyli w jednym zapytaniu tworzyć kolejne zapytania – i chciałbym żebyśmy na tym dzisiejszym filmiku sobie powiedzieli parę słów o tym zagadnieniu, czyli podzapytaniach, a potem powiemy sobie o CT.

 

Najpierw bym zaczął od podzapytań; kilka podzapytań sobie stworzymy żebyśmy mogli sobie zobaczyć jak to wszystko wygląda, jak to działa. Zrobię to na bazie sezam; wykonam polecenie, w tym momencie przekierowuje nas na serwerze do bazy Sezam bo byliśmy w jakiejś innej.

 

Pokażę może jak ta nasza baza wygląda. To jest struktura naszej bazy – tutaj są klienci, tu mamy pracowników, mamy faktury, tu obok mamy opis sprzedaży, to są pozycje faktur, czyli jak tu mamy na przykład numer faktury, no to co tutaj widzimy w tej tabeli to są po prostu pozycje na tej fakturze, czyli towary, które tu mamy, jakie towary mamy tu, a z jakiej kategorii znajdują się w tabeli „Kategorie”.

 

No i teraz tak. Na przykład zrobimy takie bardzo proste pierwsze zapytanie z podzapytaniem, a mianowicie sprawdzimy jakich mamy klientów w tym samym mieście co pracownicy; czy biznesowo ma to uzasadnienie, to jest zupełnie inna kwestia, chodzi o to żeby pokazać ideę podzapytań.

 

Zrobimy to trochę tu niestandardowo, ale sama idea jest jak najbardziej właściwa. Więc tak – tworzymy proste zapytanie, zapytania tworzymy wiadomo w jaki sposób, zaczniemy od słówka „select”, potem wpisujemy „from”, najpierw uzupełniamy froma, z prostego powodu, żeby nam podpowiadał pola do selecta, mamy najpierw tabelę „klienci”, czyli będziemy musieli wyświetlić tych klientów, mamy nazwę firmy i na przykład miasta, w którym to ci klienci się znajdują.

 

No i teraz tak – jak odpalimy to zapytanie, zaznaczamy sobie te pytania, odpalamy f5, widzimy tu listę naszych klientów z różnych miast. Mamy również tabelę, w w której znajdują się pracownicy. Jest to tabela „pracownicy” i tu mamy jakiegoś pracownika. Ja wyświetlę sobie tylko listę miast.

 

Takie mamy miasta – jakieś akurat tutaj są do wyboru, trzy jak widać, możemy sobie dodatkowo na przykład dać „distinct” i zobaczymy, że mamy trzy unikatowe miasta. No i teraz zadanie by było takie, że chcielibyśmy mieć tylko te firmy, które są w tych samych miastach co nasi pracownicy – więc to co tu wychodzi, ten nasz rezultat, chcielibyśmy dać w filtrze, czyli w „where”.

 

No i to możemy właśnie zrobić w jakiś sposób. Robimy to w taki sposób, że dorzucamy tu formę „where”,  zrobimy miasto, oczywiście tu jakbym zrobił „równa się”, w apostrofach podał jakie to miasto ma być, natomiast chodzi o to, że to ma być jedno z tych więc zrobimy bardzo ciekawą rzecz, a mianowicie, zamiast tu po „in” w nawiasie wymieniać wszystkie miasta, które chcielibyśmy aby były w wyniku, w tym nawiasie wrzucimy to nasze zapytanie.

 

Robimy tu takie ładniejsze wcięcie żeby to jakoś wyglądało i skoro nam daje to jakąś listę jednowymiarową, no to możemy sobie spokojnie tę linię użyć i teraz jak to zaznaczymy, to się okaże, że mamy tylko i wyłącznie klientów, którzy są z tego miasta co pracownicy.

 

Okazuje się, że tylko jedno miasto jest takie same, czyli Warszawa. Można oczywiście dać mu na przykład „not in”; wtedy dowiemy się o klientach, którzy są z innych miast niż nasi pracownicy, czyli spoza, czy z jakichś regionów, które nasi pracownicy obsługują. W ten oto prosty sposób uzyskaliśmy podzapytanie, czyli wstawiliśmy jedno zapytanie w drugie.

 

Czyli o co chodzi? Chodzi o to, że nasze rezultaty, które zyskujemy tutaj na dole możemy potraktować jako punkt wyjścia do utworzenia kolejnych zapytań. Oczywiście, powiem tak – nikt raczej nie robi czegoś takiego, że pisze to wszystko tak ciurkiem, robi to bardziej w sposób, w który ja tworzę, czyli najpierw tworzę jedno zapytanie, potem tworzę drugie zapytanie, a potem wkleję jedno w drugie.

 

Dzięki temu jesteśmy w stanie tworzyć wiele różnych skomplikowanych zapytań i oczywiście potem takie zapytanie może rzeczywiście powodować ból głowy jeżeli chodzi o zrozumienie. Natomiast sam proces tworzenia; musimy zachować jak największy porządek, musimy zachować w tym jakiś tam umiar. Najważniejsze jest zachowanie tych przejrzystości, różnego rodzaju wcięcie i tak dalej.

 

Ja zaraz pokażę kolejne zapytania, które będą trochę bardziej skomplikowane, ale jak zobaczymy proces tworzenia ich, okaże się, że wcale nie jest to takie trudne. Chciałbym żebyśmy zrobili średnią wartość faktur według klienta. Co musimy uzyskać? Najpierw byśmy musieli policzyć wartości faktur poszczególnych klientów.

 

Jak to zrobimy? Zrobimy proste zapytanie z joinami gdzie połączymy sobie kilka tabel ze sobą; jakbyśmy popatrzyli na nasz schemat, to żeby to uzyskać to musimy mieć nazwę klienta, czyli w tym przypadku nazwę firmy, tu sobie musimy zjoinować to z tą tabelą „sprzedaż” no i tu mamy cenę razy ilość sprzedaży więc dzięki temu uzyskamy wartość faktur per klient.

 

No i jak to zrobimy, prosty select, select from, zacznijmy może od tabeli „klienci”, dorzucimy od razu aliasy, będzie nam dużo łatwiej przy tworzeniu zapytania, połączymy z tabelą „sprzedaż”, czyli tu weźmiemy tabela „sprzedaż” od razu też, joinujemy oczywiście po ID używając aliasów, ID-klient, inner join…

 

Aliasy, które tutaj stosuję to są pierwsze literki nazwy tabel; ponieważ stosuję je tylko po to żeby rozróżnić tabele do których się odwołuję, a one i tak nigdzie nie będą wyświetlane poza Waszym zapytaniem więc stosuję dość krótkie. Aliasy mogą być oczywiście dłuższe – no i oczywiście zasady jakie tworzy się przy aliasach są takie jak ogólne zasady przy tworzeniu jakichkolwiek nazw.

 

Oczywiście można używać polskich znaków, możemy zrobić spację, ale to wszystko jest odradzane. Tutaj połączymy już po ID sprzedaży, mamy już zjoinowaną, teraz po kolei pola, które nam się przydadzą – a mianowicie nazwę firmy, ja będę wrzucał każdy nowy atrybut w osobnej linii żeby to ładnie wyglądało, potem sobie dorzucimy jeszcze ID sprzedaży.

 

Jak już używamy aliasów, to warto je stosować, dzięki temu będziemy wiedzieć co z jakiej tabeli pochodzi. Tu sobie zrobimy jeszcze ID „sprzedaż” żebyśmy wiedzieli co to za sprzedaż i dorzucimy sobie jeszcze wartość tych faktur poszczególnych. Żeby to uzyskać, musimy zrobić agregację, użyjemy funkcji „suma”, wymnożymy sobie cenę sprzedaży razy ilość no i musimy sobie oczywiście to pogrupować po nazwie firmy, posortujemy sobie najpierw po kliencie, a potem po wartości.

 

Mamy na przykład pierwszą firmę – spółkę, Alladyn, która ma pięć wyników no i to są wartość faktur, które tutaj są w naszej bazie. Oczywiście jakbyśmy chcieli żeby to jakoś ładnie wyglądała ta wartość, ładnie się prezentowała, można by było to przekonwertować albo przecastować, na przykład za pomocą funkcji cast, do typu np. „money” i wtedy będziemy mieć minimum dwa miejsca po przecinku, maksymalnie są cztery, ładnie się to prezentuje jak wrzuciliśmy to na Excela, żeśmy to przekopiowali i wrzucili, też jest to format liczbowy więc wszystko będzie się nam ładnie zgadzać.

 

A, jeżeli na przykład wynik, który byśmy uzyskali byłby z większą ilością miejsc po przecinku niż 4, no to w tym momencie nam obcina do 4; czyli jakby zaokrąglamy to w jakiś sposób no i przez to też może dzięki temu nie pojawią się jakieś błędy związane z zaokrągleniami, na przykład w Excelu dalej byśmy nad tym pracowali.

 

No i teraz sytuację mamy taką; chcielibyśmy na tym to wyniku, który tutaj uzyskaliśmy, wykonać podzapytanie, czyli zrobić z tego średnią per klient. No to co trzeba zrobić – no to wpisuję sobie tu kolejne zapytanie, select, from, no i teraz otwieram nawias i to całe, co tutaj mamy, wrzucamy jako tabelę, tak.

 

Czyli to co tutaj, nasz rezultat, który tu osiągnęliśmy to jest nasza tabela i to jest właśnie cała ta idea tych zapytań. Oczywiście ja tu nie będę robił tu czegoś takiego, że będę to pisał jeszcze raz, tak, czyli ciurkiem, tylko po prostu sobie wcześniej przygotowałem podzapytania, czyli nasz ten rezultat i sobie skopiuję.

 

I teraz taka ciekawostka – ja to  skopiuję z „order_by”, ale w podzapytaniach nie może być „order_by”, czyli jeżeli mamy tu „order_by” ze względów wydajnościowych, „order_by” jest zabronione; chyba, że użyjemy np. top. Ale tutaj topa żadnego nie używamy więc „order_by” nie możemy. Oczywiście „order_by” nie można używać również w widokach; to jest po prostu wydajnościowo zabronione.

 

Kolejna rzecz ważna, jeżeli tutaj mamy ten rezultat; ja oczywiście ten „order_by” wyrzucę bo będzie nam tylko przeszkadzał, to każde nasze podzapytanie, czyli te zapytanie, które tutaj wrzucamy w nawiasie, zawsze to musi być w nawiasie, musimy nazwać. Jeżeli tego nie nazwiemy, bo to jest traktowane jakby taka wirtualna tabela, no to w tym momencie te nasze zapytanie nie zadziała.

 

Więc musimy to jakoś nazwać i nazwę to sobie as faktury, wartości faktur według klienta. I oczywiście stosuję celowo taką długą nazwę żebyśmy wiedzieli o co chodzi, ale oczywiście nazwę moglibyśmy zastosować dużo krótszą. No i teraz tak – wracając na samą górę, do naszego selecta, to ten nasz dolny select traktujemy jako po prostu tabelę,tak. Czyli tu mamy trzy kolumny o takiej nazwie; to jeszcze kolejna bardzo ważna rzecz, każda z tych kolumn musi mieć nazwę.

 

Czyli na przykład jeżeli tutaj był cast, to musimy dać, ale i jeżeli byśmy tego nie zrobili, że to jest wartość i tu pojawi się informacja „no column name” jako zwykłe zapytanie to zadziała, natomiast jeżeli wywołamy te zapytanie jako podzapytanie, to już nie zadziała. Dlaczego?

 

Dlatego, że skoro to traktujemy jako tabelę, to każda z tych kolumn musi mieć nazwę. Zauważmy, że te nasze główne teraz zapytanie, te na zewnątrz, które tu mamy, to on widzi wszystkie pola, widzimy, wartość, też ID sprzedaży, które są w tej tabeli poniżej. Innych nie – ona nie wie, że to się składa tu na przykład z ilości ceny sprzedaży, nie ma czegoś takiego jak ilość, nie podpowiada, czyli tego nie widzi. Widzi tylko te trzy kolumny, nazwę firmy, ID, sprzedaż i VAT.

 

No i co możemy zrobić? No i w tym momencie tutaj możemy zrobić właśnie tę średnią per klient, tak, czyli sobie wrzucamy nazwę firmy. Moglibyśmy też użyć nawiasu tej tabeli, żeby było widać, że działa; zrobię sobie nazwę firmy, bierze się funkcję agregującą średnią, jak już używamy tych aliasów to już będę konsekwentny, domknę nawias bo jak nie domykamy tych nawiasów to nie chce podpowiadać, nazwa firmy i klienta, kropka, wartość i to nazwę as średnia, wartość, celowo te nazwy są przydługie, ale żeby było wiadomo o co chodzi.

 

No i oczywiście ponieważ to traktujemy jako zwykłe zapytanie, to poniżej musimy też dorzucić „group_by” ponieważ mamy funkcję agregującą. Czyli „group_by” po czym „group_by” oczywiście pod; czyli to sobie skopiuję i wrzucę tu i tu już mogę zastosować sortowanie ponieważ to już jest zewnętrzne zapytanie, tak. Czyli ze względów wydajnościowych jak najbardziej jest to już, znaczy innego wyjścia nie ma tak naprawdę, ale jest to dopuszczalne.

 

Czyli żeby było tak samo, to sobie też posortuję po nazwie firmy żebyśmy mieli w tej samej kolejności co tam mamy i teraz jak sobie tu zaznaczymy wszystko to mamy 23 rekordy, średnią wartość faktur per klient. No i tak wygląda podzapytanie. Oczywiście z podzapytaniami sytuacja wygląda tak, że tego może być bardzo, bardzo dużo, tak, czyli może być tak, że jest w tym fromie kolejny select, w tych joinach mogą być też selekty co powoduje, że to się robi bardzo, bardzo skomplikowane no i to jest jakiś tam problem, tak.

 

Trzeba tu właśnie bardzo dużo uwagę przyłożyć do tego żeby to było jak najbardziej czytelne. Czasami napisanie zapytania jest łatwiejsze niż zinterpretowania zapytania, które ktoś stworzył ze względu na to, ze właśnie te zagnieżdżenia mogą być bez par. Tu mamy tylko dwa poziomy, można powiedzieć, czyli zapytanie i podzapytanie, natomiast może być tego dużo, dużo więcej; jako takiego limitu nie ma.

 

Limitem jest nasza wyobraźnia no i jakby wielkość pól do których możemy to wpisać. W każdym razie chodzi po prostu o to, że w pewnym momencie pojawia się duży problem jeśli będzie tych zapytań więcej i podzapytań. Czy są rozwiązania? No są rozwiązania. Można tworzyć widoki o których mówić tutaj nie będziemy bądź można używać tak zwanych CTE.

 

CTE, czyli wspólne wyrażenie tablicowe jest to coś co wprowadził Microsoft w wersji SQL-a 2005. Jest to jakby rozwiązanie, panaceum na skomplikowanie. Jest to stworzone tak naprawdę głównie po to żeby ułatwić osobom, które piszą zapytania, zamieszczanie podzapytań. Bo można to oczywiście obchodzić na różne sposoby; można tworzyć tabele tymczasowe, można tworzyć widoki, tak, ale trzeba coś tworzyć.

 

Nawet stworzenie tabeli tymczasowej to jest stworzenie jakiegoś obiektu, który tymczasowo istnieje w bazie, natomiast tworzenie czegoś tak jak CTE, to jest coś takiego bardzo wirtualnego. Wszystko jest teraz teoretycznie wirtualne, ale chodzi po prostu o to, że to jest coś co tworzy się jakby w pamięci i się wszystko wykonuje w locie, czyli coś w stylu podzapytań. Nie musimy mieć do tego ani dodatkowych uprawnień, wystarczy, że możemy tworzyć zapytania i możemy użyć tego wspólnego wyrażenia tablicowego, czyli Common Table Expression, czyli CTE.

 

No i właśnie tu bym chciał o tym też dwa słowa powiedzieć. No to jak te CTE zastosować? Zrobimy sobie te CTE na bazie tego naszego zapytania, które robiliśmy przed chwilą, w sposób bardzo prosty – ja je skopiuję i po prostu przerobię je na CTE, tak. Tutaj sobie to oddzielimy, to jest CTE.

 

No i teraz tak, jak to będzie wyglądać. Bierzemy sobie to co w tym momencie było naszym podzapytaniem, czyli ten cały select, ja sobie go wyrzucę i teraz tak. Mamy with, jakąś tam nazwę, warto to jakoś nazwać; ja to nazwę prefiksem CT żebyśmy wiedzieli, że to jest CT, ale to będzie jakaś tam wartość, niech będzie ładnie, tak samo to nazwiemy jak to podzapytanie, czyli wartość faktur według klienta, S, no i otwieramy nawias.

 

Ja go otworzę i zamknę, od razu zamykam nawias bo bardzo często najzwyczajniej w świecie zapomina się o zamykaniu tych nawiasów więc lepiej od razu zamknąć. No i teraz co mamy? To co wcześniej mieliśmy tutaj w środku wrzucamy w to CT, czyli tak jakbyśmy to nazwali, czyli można było równie dobrze z tego widok zrobić.  No i teraz mamy tu takie wywołanie, które nam brakuje to.

 

I teraz co wystarczy zrobić? Tutaj w tym fromie, w sumie to podejdę wyżej, od razu pod tym, sobie zrobimy coś takiego, że to jest oczywiście wartość faktur per klient, tylko teraz tak; to się nazywa CT, wszystko poprzedzimy CT, a tu będzie właśnie to, czyli CTE, tutaj nam podpowiada, w tym momencie nagle to się to poprawi, tu też dopiszemy to CTE, dopiszemy żeby to wszystko ładnie wyglądało CTE.

 

Podkreślenia zniknęły, razem to zaznaczamy, odpalamy – wynik jest dokładnie taki sam.   Ktoś od razu powie – no dobra, ale co to daje tak naprawdę? No bo zobaczmy; wyniki są takie same, tak na dobrą sprawę te trudniejsze trochę, zmienię czcionkę i pokażę te dwa zapytania obok siebie, to z podzapytaniem i to z CT; wcale krótsze nie jest, czy jest przejrzyste to też trudno powiedzieć bo to akurat jest bardzo prosty przykład.

 

Natomiast w tym momencie nie tworzymy poziomów. Tak jak tutaj mamy, mamy poziom jeden i drugi, to tutaj wszystko jest jakby na jednym poziomie. Po kolei wymieniamy wszystkie zapytania, a potem to jest tak jakbyśmy to sobie gdzieś tam nazwali, zapisali i do tego się po prostu odwołujemy, czyli tylko w tym fromie; nie wklejamy tego tylko odwołujemy się jakby do tej etykiety, do tej nazwy, procedury, jakiejś zmiennej; do czegokolwiek co wcześniej mamy zdefiniowane.

 

Dzięki temu uzyskujemy ten sam wynik, a wydaje się, że to jest dużo prostszy zapis. Oczywiście nie musimy tworzyć tych nazw, tych etykiet; bez tych etykiet też spokojnie zobaczmy, usunąłem, tu nie ma żadnego podkreślenia, to ładnie nam zadziała więc nie musimy tego tworzyć, no oczywiście jak ktoś chce to może, nie ma tu jakby żadnych przeciwwskazań, możemy po prostu, ja to skopiowałem więc żeby było mniej pisania no to po prostu użyłem też tych etykiet, natomiast wcale tego tworzyć nie musimy.

 

Natomiast ja chciałbym teraz pokazać taki fajny przykład, który rzeczywiście pokaże nam, że to znacznie upraszcza poziom skomplikowania tych podzapytań. Ja tu sobie wcześniej przygotowałem takie dwa zapytania; to co tutaj mamy to jest jedno zapytanie, które nam pokazuje sumę wartości faktur podzielonych przez pracowników, a tu ile tych faktur mają, czyli ile każdy z nich powystawiał; czyli będzie 17, 10 i tak dalej.

 

No i teraz co byśmy chcieli zrobić? Chcielbiyśmy uzyskać taki rezultat, w którym to, jak mamy te dwa zapytania, które tu są, chcielibyśmy mieć jedną tabelkę gdzie mamy pracownika, liczbę faktur i tu wartość faktur łącznie. Ktoś powie „żaden problem”; jest problem ponieważ zobaczmy, że tu mamy jednego joina mniej i jak zapewne wiemy, na ilość joinów, które mamy, w przypadku użycia funkcji agregującej count, może mieć to wpływ.

 

Tu nie ma dorzuconych pozycji faktur bo jest niepotrzebne, tak, natomiast jak ją dorzucimy to on doliczy też pozycję faktur i te wyniki będą dużo wyższe. Nie będziemy się tym w tej chwili zajmować; w każdym razie chodzi o to żeby to zrobić jednym zapytaniem, jednym joinem, na jednym poziomie i jest to trochę utrudnione, nie niemożliwe bo da się to zrobić, natomiast tu chciałbym pokazać jak to zrobić przy użyciu właśnie CT.

 

I teraz co zrobię? Wezmę sobie te nasze dwa zapytania, zaznaczę, skopiuję i wrzucę tutaj do naszego query. Warto po skopiowaniu zawsze sobie odpalić, sprawdzić czy działają; to działa, to działa. Następnie co zrobię? Żeby uzyskać ten wynik, taki, który chcę, co bym musiał zrobić? Jakbym używał podzapytań, da się to oczywiście zrobić, to te dwie rzeczy wrzucamy jedno w drugie; w sensie, że tworzymy selecta i joinujemy te dwie tabele, tak, ten rezultat i ten rezultat.

 

Jak to zaraz zobaczymy, zapis będzie dość skomplikowany, natomiast przy użyciu CTE to będzie bardzo, bardzo proste. Zaczynamy znowu od with, tutaj zobaczmy, mamy w jaki sposób to zapisaliśmy, CT, taka ważna rzecz. Ten CTE działa i jest widoczny do wywołania, czyli do pierwszego selecta, który jest pod nim. Jeżeli już będzie kolejny select, to już ten CTE tego nie widzi. Tak samo ten CTE nie widzi tego CTE, jest widoczna do tego kolejnego selecta, którego mamy tam pod spodem.

 

Dobra, to pierwsze co mamy to jest liczba faktur więc nazwę to CTE liczba faktur S. Otwieram nawias, muszę wyrzucić „order_by” bo, tak jak w przypadku podzapytań, jeżeli nie użyję na przykład klauzuli czy jakiegoś offsetu to nie ma to sensu, ze względów optymalizacyjnych jest niedopuszczalne. Przecinek ponieważ dorzucamy kolejne CTE; teraz, jeżeli to jest jakby jeden ciąg tych wywołań to już nie używam witha bo to jest jeden with tylko, po przecinku, znowu CTE, to będą wartość faktur pracownika,zresztą nie będę pisał pracownika, więc otwieram nawias, tu na końcu „order_by” też oczywiście wyrzucam, zamykam nawias no i teraz robimy wywołanie, czyli select.

 

No i teraz tak, tu będzie join, czyli tak, pierwsza tabela jaką tu mamy, no to nasza pierwsza tabela, którą tutaj będziemy mieć to jest ta na przykład wartość faktur, czyli wybierzemy tak: CTE, wartość faktur, zrobię sobie alias żeby było ładniej i przejrzyściej, poza tym będzie to konieczne, chyba, że będę używał pełnych nazw. Potem zrobię sobie inner join, CT, liczba faktur as ton, W, kropka, no i teraz po czym joinujemy?

 

Tu w tym przypadku możemy śmiało po pracowniku. Ja mam pewność, że ci pracownicy, czyli te połączone tutaj imię z nazwiskiem jest unikatowe więc będzie ok, natomiast gdybyśmy nie mieli takiej pewności bo na przykład byłoby dwóch Janów Kowalskich, możnaby sobie w jednym i drugim selekcie jeszcze wyciągnąć ID pracownika i wtedy tu byśmy mogli sobie joinować po ID pracownika, gdybyśmy mieli stuprocentową pewność, że to jest ten sam pracownik.

 

No, tutaj nie ma takiego problemu więc mogę sobie zjoinować po tych polach bo mogę joinować tylko po tych polach, które są tu wymienione, a są tu po dwie kolumny, pracownik i liczba faktur, a tu jest pracownik i wartość; no i teraz tu sobie wymieniam pola, które chcę. No i teraz dzięki temu, że użyłem aliasy, no bo, tak jak widzimy, inaczej bym musiał podawać nazwy, to sobie będę używał aliasów wywołanych i obojętnie czy to będzie z jednej, czy z drugiej tabeli pracownik, potem sobie dorzucimy na przykład liczbę faktur, przecinek, W, kropka, wartość faktur i tak naprawdę na dobrą sprawę to wszystko.

 

Weźmiemy sobie teraz, wszystko zaznaczymy, odpalamy i mamy rezultat, który tu widać. Jeżeli byśmy chcieli teraz posortować, to żaden problem, dorzucamy jeszcze „order_by”, na przykład posortujemy sobie po trzeciej kolumnie, o, zaznaczamy, musimy to niestety całe zawsze zaznaczyć jeżeli jest kilka zapytań, no i mamy bardzo ładnie, Henryka Piecuch na pierwszym miejscu z liczbą faktur 14.

 

No, ktoś powie – dobra, jest tego trochę, ale spójrzmy, jest to jakby wszystko na jednym poziomie, mamy jeden select, mamy drugi select, trochę zaznaczania jest, ale można zawsze sobie zwinąć i mieć jedną linijkę do zaznaczania. I druga sprawa jest taka, że te wywołanie jest bardzo proste według mnie. W przeciwnym razie, tu gdzie to mamy, byśmy musieli w nawiasach umieścić całe to zapytanie. I tak samo tutaj, te drugie, tak. Czyli jedno i drugie byśmy musieli umieścić wewnątrz tego zapytania co, jak zapewne wiemy, jakbyśmy to teraz mieli analizować, to się robi dużo, dużo cięższe.

 

Tak, a za pomocą CTE no to upraszczamy znacznie ten zapis, tak. Czyli jedno z zastosowań CTE to właśnie, że te zapytania są dużo bardziej przejrzyste, a mamy wyniki tak naprawdę takie same. CTE oczywiście można używać też do rekurencji, ale o tym nie będziemy dzisiaj tutaj mówić, można też na przykład ułatwiać sobie życie jeżeli używamy funkcji rankingowych, mamy „over”, to można to robić albo podzapytaniami, filtrować, albo właśnie za pomocą CTE. To jest wszystko co chciałbym pokazać, to jest tak naprawdę tylko taki fragment, taka zajawka związana i z podzapytaniami i z CTE. Jeżeli byśmy chcieli więcej, to zapraszam na szkolenia do Altkomu. Ja dziękuję za uwagę, do widzenia.