2010-06-16 8 views
7

Zasadniczo chcę, aby to zrobić:proszę wyjaśnić usunąć górną 100 składni SQL

delete top(100) from table order by id asc 

ale MS SQL nie zezwala na zamówienie w tej pozycji

Wspólne rozwiązanie wydaje się być to:

DELETE table WHERE id IN(SELECT TOP (100) id FROM table ORDER BY id asc) 

Ale również ta metoda here:

delete table from (select top (100) * from table order by id asc) table 

który ma znacznie lepszy szacunkowy plan wykonania (74:26). Niestety tak naprawdę nie rozumiem składni, proszę, może ktoś mi to wytłumaczy?

Zawsze zainteresowany innymi metodami, aby osiągnąć ten sam wynik.

EDYCJA: Nadal go nie dostaję Obawiam się, chcę móc odczytać zapytanie, ponieważ czytam pierwsze dwa, które są praktycznie angielskie. Powyższe pytania są dla mnie:

delete the top 100 records from table, with the records ordered by id ascending 
delete the top 100 records from table where id is anyone of (this lot of ids) 
delete table from (this lot of records) table 

nie mogę zmienić trzeci w logiczną zdania angielskiego ... Chyba co próbuję dostać się na to w jaki sposób to turn into „usunąć z tabeli (ta mnóstwa zapisów) ". "Od" wydaje się być w nielogicznej pozycji, a druga wzmianka o "stole" jest logicznie zbyteczna (dla mnie).

Odpowiedz

2

Komenda delete trwa kilka podobnych form, jako słowo kluczowe from jest opcjonalny, a tabela usunięcie może być określony oddzielnie od kwerendy wybierając rekordy:

delete table where ... 

delete from table where ... 

delete table from <query...> 

delete from table from <query...> 

Pomysł z ostatnich dwóch z nich jest, że możesz najpierw zdefiniować, z której tabeli usunąć, a następnie określić zapytanie, które wybierze do usunięcia. Zapytanie może dołączyć do innych tabel, dlatego trzeba osobno zdefiniować, z której tabeli usunąć.

Kwerenda, która została znaleziona, używa podkwerendy do wybrania rekordów do usunięcia.

+0

nie mogę dopasować do jednego ze swoich 4 składni z trzecim przykładzie, który brzmi dla mnie jak „Usuń tabelę z subtable stołu”. Zobacz moją edycję na pytanie. – Patrick

+0

@Patrick: Możesz dodać opcjonalne "od" do zapytania (różnica między trzecim i czwartym formularzem powyżej), aby uczynić go bardziej logicznym. Poprawiłem powyższe formularze, aby były bardziej opisowe. – Guffa

+0

@Patrick: Zapytanie można opisać po angielsku jako "usuń wszystkie rekordy z tabeli pasujące do jego rekordów (ta część rekordów nazywa się" table ")." Zauważ, że ostatnia "tabela" w zapytaniu jest aliasem, a nie faktyczną nazwą tabeli. – Guffa

5

Tłumaczy to również here (artykuł mówi o użyciu widoku, ale przypuszczam, to samo rozumowanie należy zastosować do zapytania, jeśli są coraz lepsze plan wykonania)

pierwszy odczytuje „skasowany " część stołu dwa razy. Raz, aby zidentyfikować wiersze do usunięcia, a następnie jeszcze raz , aby wykonać usuwanie.

Po drugie unika się tego.

Edytuj To wydaje się być bardziej pytanie dotyczące składni. Składnia do usunięcia to described here.

Odpowiedni bit jest

DELETE 
    [ FROM ] 
    { <object> | rowset_function_limited 
    } 
    [ FROM <table_source> [ ,...n ] ] 

Zapytanie jest

delete alias 
from 
    (select top (100) * 
    from table 
    order by id asc) alias 

Używasz tabelę pochodzącą więc potrzebujemy FROM <table_source>. Pomijasz pierwsze opcjonalne FROM.

Powiązane problemy