TOP (Transact-SQL) (Polski)

  • 16.03.2017
  • 11 minut na przeczytanie
    • V
    • M
    • r
    • c
    • d
    • +12

Dotyczy: SQL Server (wszystkie obsługiwane wersje) Azure SQL Database Wystąpienie zarządzane Azure SQL Azure Synapse Analytics Równoległa hurtownia danych

Ogranicza wiersze zwracane w zestawie wyników zapytania do określonej liczby wierszy lub odsetka wierszy w programie SQL Server. Gdy używasz TOP z klauzulą ORDER BY, zestaw wyników jest ograniczony do pierwszej liczby N uporządkowanych wierszy. W przeciwnym razie TOP zwraca pierwszą liczbę N wierszy w nieokreślonej kolejności. Użyj tej klauzuli, aby określić liczbę wierszy zwracanych przez instrukcję SELECT. Lub użyj polecenia TOP, aby określić wiersze, na które ma wpływ instrukcja INSERT, UPDATE, MERGE lub DELETE.

Konwencje składni języka Transact-SQL

Składnia

Poniżej przedstawiono składnię SQL Server i Azure SQL Database:

Poniżej przedstawiono składnię usług Azure Synapse Analytics i Parallel Hurtownia danych:

Uwaga

Aby wyświetlić składnię języka Transact-SQL dla programu SQL Server 2014 i starszych, zobacz dokumentację poprzednich wersji .

Argumenty

wyrażenie
Wyrażenie liczbowe określające liczbę zwracanych wierszy. wyrażenie jest niejawnie konwertowane na wartość zmiennoprzecinkową, jeśli określisz PERCENT. W przeciwnym razie wyrażenie jest konwertowane na bigint.

PERCENT
Wskazuje, że zapytanie zwraca tylko pierwszy wyrażony procent wierszy z zestawu wyników. Wartości ułamkowe są zaokrąglane w górę do następnej liczby całkowitej.

Z TIESAMI
Zwraca dwa lub więcej wierszy, które wiążą się na ostatnim miejscu w ograniczonym zestawie wyników. Musisz użyć tego argumentu z klauzulą ORDER BY. Z TIES może spowodować zwrócenie większej liczby wierszy niż wartość określona w wyrażeniu. Na przykład, jeśli wyrażenie jest ustawione na 5, ale dwa dodatkowe wiersze pasują do wartości kolumn ORDER BY w wierszu 5, zestaw wyników będzie zawierał siedem wierszy.

Możesz określić klauzulę TOP za pomocą funkcji WITH TIES argument tylko w instrukcjach SELECT i tylko wtedy, gdy określono również klauzulę ORDER BY. Zwrócona kolejność wiązania rekordów jest dowolna. ORDER BY nie ma wpływu na tę regułę.

Najlepsze praktyki

W instrukcji SELECT zawsze używaj klauzuli ORDER BY z klauzulą TOP. Ponieważ jest to jedyny sposób, aby w przewidywalny sposób wskazać, na które wiersze ma wpływ TOP.

Użyj OFFSET i FETCH w klauzuli ORDER BY zamiast klauzuli TOP, aby zaimplementować rozwiązanie stronicowania zapytań. Rozwiązanie stronicowania ( czyli wysyłanie fragmentów lub „stron” danych do klienta) jest łatwiejsze do zaimplementowania za pomocą klauzul OFFSET i FETCH. Aby uzyskać więcej informacji, zobacz klauzulę ORDER BY (Transact-SQL).

Użyj TOP (lub OFFSET i FETCH) zamiast SET ROWCOUNT w celu ograniczenia liczby zwracanych wierszy. Te metody są preferowane zamiast używania SET ROWCOUNT z następujących powodów:

  • Jako część instrukcji SELECT, optymalizator zapytań może uwzględnić wartość wyrażenia w klauzulach TOP lub FETCH podczas optymalizacji zapytania. Ponieważ używasz SET ROWCOUNT poza instrukcją, która uruchamia zapytanie, jego wartość nie może być uwzględniona w planie zapytań.

Obsługa zgodności

W celu zapewnienia zgodności z poprzednimi wersjami nawiasy są opcjonalne w instrukcjach SELECT, jeśli wyrażenie jest liczbą całkowitą Mrówka. Zalecamy, aby zawsze używać nawiasów jako TOP w instrukcjach SELECT. Takie postępowanie zapewnia spójność z wymaganym użyciem w instrukcjach INSERT, UPDATE, MERGE i DELETE.

Współdziałanie

Wyrażenie TOP nie wpływa na instrukcje, które mogą być uruchamiane z powodu wyzwalacza. Wstawione i usunięte tabele w wyzwalaczach zwracają tylko te wiersze, na które rzeczywiście mają wpływ instrukcje INSERT, UPDATE, MERGE lub DELETE. Na przykład, jeśli wyzwalacz INSERT TRIGGER jest uruchamiany w wyniku instrukcji INSERT, w której użyto klauzuli TOP.

SQL Server umożliwia aktualizację wierszy poprzez widoki. Ponieważ w definicji widoku można uwzględnić klauzulę TOP, niektóre wiersze mogą zniknąć z widoku, jeśli wiersze nie spełniają już wymagań wyrażenia TOP z powodu aktualizacji .

Gdy jest określona w instrukcji MERGE, klauzula TOP ma zastosowanie po połączeniu całej tabeli źródłowej i całej tabeli docelowej. A połączone wiersze, które nie kwalifikują się do wstawiania, aktualizowania ani usuwania działania są usuwane. Klauzula TOP dodatkowo zmniejsza liczbę połączonych wierszy do określonej wartości, a czynności wstawiania, aktualizowania lub usuwania mają zastosowanie do pozostałych połączonych wierszy w nieuporządkowany sposób. Oznacza to, że nie ma kolejności, w jakiej wiersze są rozdzielane między akcje zdefiniowane w klauzulach WHEN.Na przykład, jeśli określenie TOP (10) wpływa na 10 wierszy, siedem z tych wierszy może zostać zaktualizowanych, a trzy wstawione. Albo jeden może zostać usunięty, pięć zaktualizowany, cztery wstawione i tak dalej. Ponieważ instrukcja MERGE wykonuje pełne skanowanie zarówno tabeli źródłowej, jak i docelowej, użycie klauzuli TOP w celu zmodyfikowania dużej tabeli przez utworzenie wielu partii może mieć wpływ na wydajność operacji we / wy. W tym scenariuszu ważne jest, aby upewnić się, że wszystkie kolejne partie dotyczą nowych wierszy.

Zachowaj ostrożność podczas ponownego określania klauzuli TOP w zapytaniu zawierającym UNION, UNION ALL, EXCEPT lub INTERSECT operator. Możliwe jest napisanie zapytania zwracającego nieoczekiwane wyniki, ponieważ kolejność, w jakiej klauzule TOP i ORDER BY są przetwarzane logicznie, nie jest zawsze intuicyjna, gdy te operatory są używane w operacji selekcji. Na przykład, biorąc pod uwagę poniższą tabelę i dane, załóżmy, że chcesz zwrócić najtańszy czerwony samochód i najtańszy niebieski samochód. To znaczy czerwony sedan i niebieski van.

Aby uzyskać takie wyniki, możesz napisać następujące zapytanie.

Poniżej znajduje się zestaw wyników.

Nieoczekiwane wyniki są zwracane, ponieważ klauzula TOP logicznie działa przed klauzulą ORDER BY, która sortuje wyniki operatora (w tym przypadku UNION ALL). Zatem poprzednie zapytanie zwraca jeden czerwony samochód i jeden niebieski samochód, a następnie porządkuje wynik tej sumy według ceny. Poniższy przykład pokazuje poprawną metodę pisania tego zapytania w celu uzyskania pożądanego wyniku.

Używając TOP i ORDER BY w operacji podselekcji, upewniasz się, że wyniki klauzuli ORDER BY są stosowane do TOP klauzula, a nie sortowanie wyniku operacji UNION.

Oto zestaw wyników.

Ograniczenia i ograniczenia

Kiedy używasz TOP z INSERT, UPDATE, MERGE lub DELETE, przywoływane wiersze nie są ułożone w żadnej kolejności. I nie możesz bezpośrednio określić klauzuli ORDER BY w tych instrukcjach. Jeśli chcesz użyć TOP do wstawiania, usuwania lub modyfikowania wierszy w zrozumiałej kolejności chronologicznej, użyj TOP z klauzulą ORDER BY określoną w instrukcji podselekcji. Zobacz następującą sekcję Przykłady w tym artykule.

Nie można używać TOP w instrukcjach UPDATE i DELETE w widokach partycjonowanych.

Nie można łączyć TOP z OFFSET i FETCH w to samo wyrażenie zapytania (w tym samym zakresie zapytania). Aby uzyskać więcej informacji, zobacz klauzulę ORDER BY (Transact-SQL).

Przykłady

Kategoria Wyróżnione elementy składni
Podstawowa składnia TOP • PERCENT
W tym wartości remisu Z WIĄZAMI
Ograniczenie wierszy, na które ma wpływ DELETE, INSERT lub UPDATE DELETE • INSERT • UPDATE

Podstawowa składnia

Przykłady w tej sekcji przedstawiają podstawową funkcjonalność klauzuli ORDER BY przy użyciu minimalnej wymaganej składni.

ZA. Używanie TOP ze stałą wartością

W poniższych przykładach użyto stałej wartości do określenia liczby pracowników zwracanych w zestawie wyników zapytania. W pierwszym przykładzie zwracanych jest pierwszych 10 niezdefiniowanych wierszy, ponieważ nie użyto klauzuli ORDER BY. W drugim przykładzie klauzula ORDER BY jest używana do zwracania 10 najczęściej zatrudnianych ostatnio pracowników.

B. Używanie funkcji TOP ze zmienną

W poniższym przykładzie zastosowano zmienną do określenia liczby pracowników zwracanych w zestawie wyników zapytania.

C. Określanie wartości procentowej

W poniższym przykładzie zastosowano parametr PERCENT do określenia liczby pracowników zwracanych w zestawie wyników zapytania. Jest ich 290 pracowników w tabeli HumanResources.Employee. Ponieważ pięć procent z 290 to wartość ułamkowa, wartość jest zaokrąglana w górę do następnej liczby całkowitej.

Uwzględnianie wartości remisu

A. Używanie funkcji WITH TIES w celu uwzględnienia wierszy pasujących do wartości w ostatnim wierszu

W poniższym przykładzie pobierane jest pierwsze 10 procent wszystkich pracowników z najwyższym wynagrodzeniem a nd zwraca ich w porządku malejącym, zgodnie z ich wynagrodzeniem. Określenie WITH TIES gwarantuje, że pracownicy o wynagrodzeniach równych najniższemu zwróconemu wynagrodzeniu (ostatni wiersz) również zostaną uwzględnieni w zestawie wyników, nawet jeśli przekracza ono 10 procent pracowników.

Ograniczenie wierszy, na które ma wpływ DELETE, INSERT lub UPDATE

A. Korzystanie z funkcji TOP w celu ograniczenia liczby usuwanych wierszy

Jeśli używasz klauzuli TOP (n) z DELETE, operacja usuwania jest wykonywana na niezdefiniowanej liczbie n wierszy. Oznacza to, że instrukcja DELETE wybiera dowolną (n) liczbę wierszy, które spełniają kryteria zdefiniowane w klauzuli WHERE.Poniższy przykład usuwa wiersze 20 z tabeli PurchaseOrderDetail, których terminy ukończenia są wcześniejsze niż 1 lipca 2002 r.

Jeśli chcesz użyć TOP do usuwania wierszy w sensownym porządku chronologicznym, użyj TOP z ORDER BY w instrukcji podselekcji. Poniższe zapytanie usuwa 10 wierszy tabeli PurchaseOrderDetail, które mają najwcześniejsze terminy. Aby zapewnić usunięcie tylko 10 wierszy, kluczem podstawowym tabeli jest kolumna określona w instrukcji podselekcji (PurchaseOrderID). Użycie kolumny niebędącej kluczem w instrukcji subselect może spowodować usunięcie więcej niż 10 wierszy, jeśli określona kolumna zawiera zduplikowane wartości.

B. Korzystanie z funkcji TOP w celu ograniczenia liczby wstawianych wierszy

Poniższy przykład tworzy tabelę EmployeeSales i wstawia nazwę oraz dane dotyczące sprzedaży od początku roku dla pięciu pierwszych pracowników z tabeli HumanResources.Employee. Instrukcja INSERT wybiera dowolne pięć wierszy zwróconych przez instrukcję SELECT, które spełniają kryteria zdefiniowane w klauzuli WHERE. Klauzula OUTPUT wyświetla wiersze wstawiane do tabeli EmployeeSales. Zauważ, że klauzula ORDER BY w instrukcji SELECT nie jest używana do określenia pięciu najlepszych pracowników.

Jeśli chcesz użyć TOP do wstawiania wierszy w sensownym porządku chronologicznym, użyj TOP z ORDER BY w instrukcja subselect. Poniższy przykład ilustruje, jak to zrobić. Klauzula OUTPUT wyświetla wiersze wstawione do tabeli EmployeeSales. Zauważ, że pięciu najlepszych pracowników jest teraz wstawianych na podstawie wyników klauzuli ORDER BY zamiast niezdefiniowanych wierszy.

C. Użycie TOP do ograniczenia liczby aktualizowanych wierszy

Poniższy przykład używa klauzuli TOP do aktualizacji wierszy w tabeli. Jeśli używasz klauzuli TOP (n) z UPDATE, operacja aktualizacji jest wykonywana na niezdefiniowanej liczbie wierszy. Oznacza to, że instrukcja UPDATE wybiera dowolną (n) liczbę wierszy, które spełniają kryteria zdefiniowane w klauzuli WHERE. Poniższy przykład przypisuje 10 klientów od jednego sprzedawcy do drugiego.

Jeśli musisz użyj TOP, aby zastosować aktualizacje w sensownej chronologii, musisz użyć TOP razem z ORDER BY w instrukcji podselekcji. Poniższy przykład aktualizuje godziny urlopu 10 pracowników z najwcześniejszymi datami zatrudnienia.

Przykłady: Azure Synapse Analytics i Parallel Data Warehouse

Poniższy przykład zwraca 31 pierwszych wierszy, które spełniają kryteria zapytania. Klauzula ORDER BY gwarantuje, że 31 zwróconych wierszy będzie pierwszymi 31 wierszami w kolejności alfabetycznej kolumny LastName.

Korzystanie z opcji TOP bez określania powiązań.

Wynik: zwróconych zostało 31 wierszy.

Używając TOP, określając Z TIES.

Wynik: zwracane są 33 wiersze, ponieważ trzech pracowników o nazwisku Brown tie w 31. wierszu.

Zobacz także

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *