Zacząłem czytać o Common Table Expression i nie mogę wymyślić przypadku użycia, w którym musiałbym ich użyć. Wydają się być zbędne, podobnie jak w przypadku tabel pochodnych. Czy brakuje mi czegoś lub źle rozumiem? Czy ktoś może podać prosty przykład ograniczeń z regularnymi zapytaniami do tabeli wyboru, pochodnej lub tabeli tymczasowej, aby przedstawić przypadek CTE? Wszelkie proste przykłady byłyby bardzo mile widziane.
select top 100 * into #tmp from master..spt_values order by 1,2,3,4 select A.number, COUNT(*) from #tmp A inner join #tmp B ON A.number = B.number+1 group by A.number
vswith CTE AS (select top 100 * from master..spt_values order by 1,2,3,4) select A.number, COUNT(*) from CTE A inner join CTE B ON A.number = B.number+1 group by A.number
Używam ich do dzielenia złożonych zapytań, szczególnie złożonych sprzężeń i podpytw zapytań. Uważam, że coraz częściej używam ich jako „pseudo-widoków”, aby pomóc mi zrozumieć cel zapytania.
Moją jedyną skargą na nie jest to, że nie można ich ponownie użyć. Na przykład mogę mieć zapisany proc z dwiema instrukcjami aktualizacji, które mogłyby korzystać z tego samego CTE. Ale „zakres” CTE jest tylko pierwszym zapytaniem.
Problem w tym, że „proste przykłady” prawdopodobnie tak naprawdę nie potrzebują CTE!
Mimo to bardzo przydatny.
źródło
VIEW
:)Są dwa powody, dla których używam cte.
Aby użyć wartości obliczonej w klauzuli where. Wydaje mi się to trochę czystsze niż tabela pochodna.
Załóżmy, że istnieją dwie tabele - Pytania i odpowiedzi połączone razem przez pytania.ID = Answers.Question_Id (i identyfikator quizu)
Oto kolejny przykład, w którym chcę uzyskać listę pytań i odpowiedzi. Chcę, aby odpowiedzi były grupowane z pytaniami w wynikach.
źródło
HAVING
jest innym sposobem na wykonanie filtra późnego etapu, który może być podobny do korzystania z sub-SELECT
Jednym ze scenariuszy, który uznałem za użyteczny przy użyciu CTE, jest to, gdy chcesz uzyskać DISTINCT wiersze danych na podstawie jednej lub więcej kolumn, ale zwrócisz wszystkie kolumny w tabeli. W przypadku standardowego zapytania może być konieczne zrzucenie różnych wartości do tabeli tymczasowej, a następnie próba ponownego połączenia ich z oryginalną tabelą w celu odzyskania pozostałych kolumn lub napisania bardzo złożonego zapytania dotyczącego partycji, które może zwrócić wyniki jeden przebieg, ale najprawdopodobniej będzie nieczytelny i spowoduje problemy z wydajnością.
Ale za pomocą CTE (jak odpowiedział Tim Schmelter na Select the first instance of a record )
Jak widać, jest to o wiele łatwiejsze do odczytania i utrzymania. I w porównaniu do innych zapytań jest znacznie lepszy w wydajności.
źródło
Być może bardziej sensowne jest myślenie o CTE jako zamienniku widoku używanego dla pojedynczego zapytania. Ale nie wymaga narzutu, metadanych ani trwałości formalnego widoku. Bardzo przydatne, gdy potrzebujesz:
Oto przykład wycinania i wklejania do zabawy:
Cieszyć się
źródło
Dzisiaj dowiemy się o Wyrażeniu wspólnej tabeli, która jest nową funkcją, która została wprowadzona w SQL Server 2005 i dostępna również w późniejszych wersjach.
Wspólne wyrażenie tabeli: - Wspólne wyrażenie tabeli można zdefiniować jako tymczasowy zestaw wyników lub innymi słowy jest to zamiennik widoków w programie SQL Server. Wspólne wyrażenie tabelowe jest poprawne tylko w partii instrukcji, w której zostało zdefiniowane, i nie może być używane w innych sesjach.
Składnia deklarującego CTE (wspólne wyrażenie tabelowe): -
Weźmy przykład: -
Utworzyłem dwie tabele pracownik i Dział i wstawiłem 5 wierszy w każdej tabeli. Teraz chciałbym dołączyć do tych tabel i utworzyć tymczasowy zestaw wyników, aby dalej z niego korzystać.
Weźmy każdy wiersz instrukcji jeden po drugim i zrozummy.
Aby zdefiniować CTE, piszemy klauzulę „with”, a następnie nadajemy nazwę wyrażeniu tabelowemu, tutaj nadałem nazwę jako „CTE_Example”
Następnie piszemy „As” i umieszczamy nasz kod w dwóch nawiasach (---), możemy łączyć wiele tabel w załączonych nawiasach.
W ostatnim wierszu użyłem „Wybierz * z CTE_Example”, odnoszimy się do wyrażenia Common table w ostatnim wierszu kodu, więc możemy powiedzieć, że jest to widok, w którym definiujemy i używamy widoku w jednym partia i CTE nie są przechowywane w bazie danych jako obiekt stały. Ale zachowuje się jak widok. możemy wykonać usunięcie i aktualizację instrukcji CTE, co będzie miało bezpośredni wpływ na tabelę, do której się odnoszą, które są używane w CTE. Weźmy przykład, aby zrozumieć ten fakt.
W powyższej instrukcji usuwamy wiersz z CTE_Example i spowoduje to usunięcie danych z przywoływanej tabeli „DEPT”, która jest używana w CTE.
źródło
Jest to bardzo przydatne, gdy chcesz wykonać „zamówioną aktualizację”.
MS SQL nie pozwala na użycie ORDER BY z UPDATE, ale przy pomocy CTE możesz to zrobić w ten sposób:
Zajrzyj tutaj, aby uzyskać więcej informacji: Jak zaktualizować i zamówić za pomocą ms sql
źródło
Jedną z kwestii, których jeszcze nie wymieniono, jest prędkość . Wiem, że to stare pytanie, na które udzielono odpowiedzi, ale myślę, że zasługuje na bezpośredni komentarz / odpowiedź:
Kiedy pierwszy raz użyłem CTE, byłem absolutnie oszołomiony jego szybkością. To był przypadek jak z podręcznika, bardzo odpowiedni dla CTE, ale we wszystkich przypadkach, w których kiedykolwiek korzystałem z CTE, nastąpił znaczny wzrost prędkości. Moje pierwsze zapytanie było złożone z tabelami pochodnymi, których wykonanie zajęło wiele minut. Z CTE zajęło to ułamki sekund i wstrząsnęło mną, że to w ogóle możliwe.
źródło
Spróbuj tego
źródło