Jak działa WITH w SQL, czyli co to jest Common Table Expression (CTE)?

Поділитися
Вставка
  • Опубліковано 7 січ 2025

КОМЕНТАРІ • 33

  • @Siejec
    @Siejec Рік тому

    Super filmik! Naturalny bez fakeowych reakcji. 7:00 to dokładnie twarz jaką ja robię kiedy kwerenda nie działa jak byłem pewien, że powinna zadziałać

    • @nieinformatyk
      @nieinformatyk  Рік тому

      Haha, staram się przygotowywać do nagrań, ale nie zawsze wychodzi idealnie w 100%:)

  • @mpo14-t2y
    @mpo14-t2y Рік тому

    Fajny kanał, dopiero zaczynam przygodę z twoim kanałem, ale chętnie pooglądam filmy :) życzę dalszego rozwoju! :)

  • @martinnereg6769
    @martinnereg6769 Рік тому

    Serwus Darek, w końcu znalazłem czas, aby obejrzeć Twoją lekcję. Cały czas miałem ją na liście otwartej z moim zadaniami. Teraz rozumiem czym jest CTE i powinienem go kojarzysz przede wszystkim z operacjami w hurtowniach danych. Uważam że lekcja bardzo interesująca tymbardziej, że w Internecie trudno znaleźć tak dobrze "spakowane" informacje o CTE. Pozdrawiam.

    • @nieinformatyk
      @nieinformatyk  Рік тому

      Dzięki Martin :)

    • @martinnereg6769
      @martinnereg6769 Рік тому

      @@nieinformatyk Darek a czy nagrywałeś może lekcję o instrukcji MERGE? Dzięki za Twój czas.

    • @nieinformatyk
      @nieinformatyk  Рік тому

      @@martinnereg6769 Nie, jeszcze nie nagrywałem. Znajdzie się na pewno w kursie SQL: promo.mistrzsql.pl/

  • @dariuszmion2764
    @dariuszmion2764 11 місяців тому +2

    W kwestii Common Table Expression (CTE) przydało by się rozszerzenie materiału o zapytania rekurencyjne "WITH RECURSIVE" 😉

    • @nieinformatyk
      @nieinformatyk  11 місяців тому +1

      Będę to dokładnie omawiał w kursie SQL: promo.mistrzsql.pl/ Porównamy też sobie RECURSIVE CTE z CONNECT BY w Oracle :)

    • @dariuszmion2764
      @dariuszmion2764 11 місяців тому

      @@nieinformatyk Nie Pomijaj też MySQL i MariaDB jako bardzo popularnych silników bazodanowych ;)

    • @nieinformatyk
      @nieinformatyk  11 місяців тому

      @@dariuszmion2764 w kursie omawiam każde zagadnienie na przykładzie Oracle, Sql Server i Postgres. Rozszerzanie tego na kilka kolejnych silników wydłużałoby jeszcze bardziej kurs, a tego chciałem uniknąć.

  • @MsMalcolmX
    @MsMalcolmX Рік тому

    Jak zwykle materiał na najwyższym poziomie :) Pozdrawiam ;)

  • @kate_z317
    @kate_z317 Рік тому

    Dziękuję za ten film! :)

  • @KRusin-po8mu
    @KRusin-po8mu 11 місяців тому

    Hej, dziękuję, film mega przydatny. Czy planujesz jeszcze rozwinąć temat struktur drzewiastych? (Connect by prior) :)

    • @nieinformatyk
      @nieinformatyk  11 місяців тому

      W najbliższym czasie na YT raczej nie, bo mam już przygotowanych kilka tematów na kolejne materiały. W kursie SQL promo.mistrzsql.pl/ będzie ten temat kompleksowo poruszony: CONNECT BY (NOCYCLE), START WITH, ORDER BY SIBLINGS, LEVEL, CONNECT_BY_ISCYCLE, CONNECT BY_ISLEAF, PRIOR, CONNEC_BY_ROOT oraz SYS_CONNECT_BY_PATH. Porównamy też sobie te Oraclowe rozwiązanie z RECURSIVE CTE :)

  • @Tylywizor
    @Tylywizor Рік тому

    Temat na czasie dla mnie, dzisiaj przerobiłem zapytanie z CTE na tabelki tymczasowe #. Czas z 2 minut zszedł do 1 sec :D Nie wiem jakim cudem bo zapytanie nie było jakies skomplikowane.

  • @markippo
    @markippo Рік тому

    Myślę, że ta ciągła popularność cte w Oracle jest efektem problematycznej implementacji tabel tymczasowych. Nie używałem już Oracle/pl/sqla od dłuższego czasu, ale w 11g tymczasówki były fatalne i dalekie od into #tabelka. W sql server cte można spotkać bardzo rzadko albo jako efekt zaprzeszłości, wzięcia czegoś pierwszego lepszego lub bardzo specjalistycznych zastosowań. Sam korzystam z nich do prostej deduplilacji - w myśl zasady relacyjnej "modifikacja obiektu abstrakcyjnego, zmienia obiekt fizyczny", widziałem też bardziej analityczne zastosowania rekurencyjne, gdzie cte odwołuje się do cte.
    W bazach data warehouse być może zastosowanie dla cte jest większe, ale ich użycie jest zwykle bardzo problematyczne i dość niewydajne. Problemem jest jak zwykle ram, którego w HD jest zawsze za mało, a nierozważne użycie cte tylko ten problem potęguje. No i całość jest doraźna - każdorazowo zapytanie musi zostać wykonane, co przy pracach rozwojowych jest... Utrudnieniem...
    W zastosowaniach analitycznych unikałbym cte jak ognia, lepiej już tworzyć stałe, techniczne tabele, które po zakończeniu zostaną zdropowane. Większe zapytania wyraźnie korzystają na atomizacji, gdzie każde kolejne kroki są stosunkowo niespomplikowane, nie posiadają ani podzapytań (zwłaszcza w Select) , ani cte - korzystają z kroków poprzedzających.
    Uważam, że bazy Oracle bardziej nadają się do HD, pl/sql też jest dalece bardziej rozbudowany od t-sqla, ale nie rozumiem, dlaczego Oracle pokpiło tak te tymczasówki - to bardzo wygodne rozwiązanie.

    • @nieinformatyk
      @nieinformatyk  Рік тому

      Ja mam dobre doświadczenie z CTE w hurtowni, świetnie sobie radził i do tego upraszczał czytelność :) Trzeba było tylko uważać by nie nadużywać HINT-a MATERIALIZE bo łatwo zapchać pamięć, szczególnie, gdy zapisujemy w liście SELECT więcej kolumn niż de facto jest potrzebne.

  • @filipgrydz
    @filipgrydz Рік тому

    #zasieg
    CTE spoko, ale nerwy zawsze mam jak cos zakomentuje w kodzie żeby je pościć a później tego szukam w 300 linijkach.

    • @nieinformatyk
      @nieinformatyk  Рік тому

      Bywa upierdliwe. Dobrze dlatego nie przesadzać z tym cte i używać widoków i tabel zmaterializowanych. Kod robi się od razu krótszy.

  • @TomaszTomzik
    @TomaszTomzik Рік тому +1

    A wg mnie hint "materialize" powinien być domyślny w with. Co do pierwszej wady to się nie zgodzę, trudno uznać za wadę złe użycie danego rozwiązania... Generalnie wady trochę wyciągnięte na siłę ;)

    • @nieinformatyk
      @nieinformatyk  Рік тому +1

      Dzięki za opinię Tomasz :) Moim zdaniem WITH służy do tworzenia logicznych bloków zapytań, które zapisane jako jeden SELECT są nieczytelne. Jeśli z kolei używamy WITH-a do prostego SELECT * FROM tabela to uzyskujemy efekt dokładnie odwrotny - zwiększamy niepotrzebnie ilość linii kodu i sprawiamy, że ktoś inny może się doszukiwać drugiego dna tego rowiązania -> "hm.. po co ktoś tu robił witha? Chodzi o plan zapytania? pewnie umie zrobić łączenie po kilku kolumnach więc po coś to jest " Ja przynajmniej miałbym takie rozkminy :)
      To trochę jakbyś użył funkcji analitycznej zamiast standardowego grupowania - tylko dlatego, że jest trendy i każdy pisze, że to zaawansowany SQL.

    • @nieinformatyk
      @nieinformatyk  Рік тому

      A co do materialize? Czemu tak uważasz? Jeśli ktoś do podzapytania z WITH-a będzie odnosił się tylko raz w SELEC-ie to na moje oko ten hint bardziej zaszkodzi, bo będzie narzut czasu na niepotrzebne tworzenie segmentu tymczasowego z danymi. Wtedy trzeba by pisać NOMATERIALIZE :)

    • @TomaszTomzik
      @TomaszTomzik Рік тому

      @@nieinformatyk Materlizowanie czasami działa szybciej nawet jak się odwołujesz raz... na to wskazuje moje doświadczenie, ale nie dam sobie ręku uciąć.

  • @DenizDemir-wz5vq
    @DenizDemir-wz5vq Рік тому

    #zasieg

  • @maciejszypula
    @maciejszypula Рік тому

    Szacun za Kimballa na półce :)

  • @therewereattempts
    @therewereattempts 13 днів тому

    dla mnie podzapytania >>> CTE

    • @nieinformatyk
      @nieinformatyk  12 днів тому

      Dzięki za podzielenie się opinią :)