Patrzyłem CROSS / OUTER APPLY
z kolegą i staramy się znaleźć przykłady z życia, gdzie ich używać.
Spędziłem sporo czasu, zastanawiając się, kiedy należy używać funkcji krzyżowej zamiast łączenia wewnętrznego? i googlowanie, ale główny (jedyny) przykład wydaje się dość dziwny (użycie liczby wierszy z tabeli do określenia, ile wierszy należy wybrać z innej tabeli).
Pomyślałem, że ten scenariusz może skorzystać na OUTER APPLY
:
Tabela kontaktów (zawiera 1 rekord dla każdego kontaktu) Tabela wpisów komunikacji (może zawierać n numerów telefonów, faksów, e-maili dla każdego kontaktu)
Ale za pomocą podzapytania, typowych wyrażeń tabeli, OUTER JOIN
ze RANK()
i OUTER APPLY
wszystkie wydają się wykonać jednakowo. Zgaduję, że to oznacza, że scenariusz nie ma zastosowania do APPLY
.
Udostępnij kilka przykładów z życia wziętych i pomóż wyjaśnić tę funkcję!
źródło
Odpowiedzi:
Niektóre zastosowania
APPLY
to ...1) Najczęstsze N zapytań na grupę (może być bardziej wydajne w przypadku niektórych liczebności)
2) Wywołanie funkcji wartościowanej w tabeli dla każdego wiersza w zapytaniu zewnętrznym
3) Ponowne użycie aliasu kolumny
4) Cofanie obracania więcej niż jednej grupy kolumn
Zakłada, że 1NF narusza strukturę tabeli ....
Przykład przy użyciu
VALUES
składni 2008+ .W 2005
UNION ALL
można użyć zamiast.źródło
Są różne sytuacje, w których nie można uniknąć
CROSS APPLY
lubOUTER APPLY
.Rozważ, że masz dwa stoły.
STÓŁ GŁÓWNY
TABELA SZCZEGÓŁÓW
Istnieje wiele sytuacji, w której musimy wymienić
INNER JOIN
zCROSS APPLY
.1. Jeśli chcemy połączyć 2 tabele
TOP n
wyników zINNER JOIN
funkcjonalnościąRozważyć, czy musimy wybrać
Id
iName
odMaster
a ostatnie dwa terminy dla każdegoId
zDetails table
.Powyższe zapytanie generuje następujący wynik.
Widzisz, wygenerował wyniki dla ostatnich dwóch dat z ostatnimi dwoma datami,
Id
a następnie dołączył do tych rekordów tylko w zewnętrznym zapytaniuId
, co jest błędne. Aby to osiągnąć, musimy użyćCROSS APPLY
.i tworzy następujący wynik.
Oto praca. Zapytanie wewnątrz
CROSS APPLY
może odwoływać się do zewnętrznej tabeli, gdzieINNER JOIN
nie może tego zrobić (zgłasza błąd kompilacji). Podczas wyszukiwania dwóch ostatnich dat, łączenie odbywa się wewnątrzCROSS APPLY
tjWHERE M.ID=D.ID
.2. Kiedy potrzebujemy
INNER JOIN
funkcjonalności za pomocą funkcji.CROSS APPLY
może być używany jako zamiennik,INNER JOIN
gdy musimy uzyskać wynik zMaster
tabeli i plikufunction
.A oto funkcja
który wygenerował następujący wynik
1. Jeśli chcemy połączyć 2 tabele
TOP n
wyników zLEFT JOIN
funkcjonalnościąZastanów się, czy musimy wybrać identyfikator i nazwę od
Master
oraz ostatnie dwie daty dla każdego identyfikatora zDetails
tabeli.co tworzy następujący wynik
To przyniesie błędne wyniki, tzn. Przyniesie tylko ostatnie dwie daty z
Details
tabeli, niezależnie odId
tego, czy dołączymy doId
. Więc właściwym rozwiązaniem jest użycieOUTER APPLY
.co daje następujący pożądany rezultat
2. Kiedy potrzebujemy
LEFT JOIN
funkcjonalności przy użyciufunctions
.OUTER APPLY
może być używany jako zamiennik,LEFT JOIN
gdy musimy uzyskać wynik zMaster
tabeli i plikufunction
.I funkcja jest tutaj.
który wygenerował następujący wynik
CROSS APPLY
lubOUTER APPLY
może służyć do zachowywaniaNULL
wartości podczas unieruchamiania, które są wymienne.Weź pod uwagę, że masz poniższą tabelę
Jeśli użyjesz
UNPIVOT
do przeniesieniaFROMDATE
ANDTODATE
do jednej kolumny,NULL
domyślnie wyeliminuje to wartości.co generuje poniższy wynik. Zauważ, że przegapiliśmy rekord
Id
liczby3
W takich przypadkach
CROSS APPLY
lubOUTER APPLY
będzie przydatnaktóry tworzy następujący wynik i zachowuje
Id
tam, gdzie jest jego wartość3
źródło
Przykładem z życia może być planista i chcesz zobaczyć, jaki jest najnowszy wpis dziennika dotyczący każdego zaplanowanego zadania.
źródło
Aby odpowiedzieć na powyższy punkt, przytocz przykład:
A teraz uruchom dwa zapytania z planem wykonania.
Jak widać, zewnętrzne zapytanie stosujące jest bardziej wydajne. (Nie można dołączyć planu, ponieważ jestem nowym użytkownikiem ... Doh.)
źródło