Въпрос: Извличане на ТОП 10 реда, без да използвате TOP или LIMIT?
Отговор: Когато ми беше зададен този въпрос в неотдавнашната ми Изчерпателна проверка на ефективността на базата данни , попитах обратно на човека защо иска да изобрети колелото. Въпреки това, когато получих отговора му, сега наистина съм съгласен с разсъжденията.
Ето причината: Не искаме да използваме TOP или LIMIT, тъй като те всъщност не са ANSI реализация. Искаме да извлечем горните редове по такъв начин, че да може да работи в различни бази данни като SQL Server, MySQL, MariaDB, както и PostgreSQL.
Всички бази данни са внедрили собствена логика за извличане на горните редове. SQL Server използва TOP ключови думи, докато MySQL, MariaDB и PostgreSQL използват LIMIT ключова дума за ограничаване на редовете в SQL Server. Това представлява уникални предизвикателства пред доставчиците на трети страни, които пишат код, който може да бъде включен във всяка RDBMS. Те трябва да напишат код за вещица условия и да поддържат две различни версии на логиката. Ако обаче използвате следния метод, той ще работи във всички последни версии на релационните бази данни.
ИЗБЕРЕТЕ ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_DEFINITIONFROM (ИЗБЕРЕТЕ ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_DEFINITION,ROW_NUMBER() НАД (ПОРЪЧКА ПО ROUTINE_NAME) КАТО ROWNUMFROM INFORMATION_SCHEMA.ROUTINESWHERE'=ROUTINESWHERE'=ROUTINESWHERE'=ROUTC_WHERE'=ROUTINESWHERE'ROUTCТова ще работи с всички познати релационни бази данни, на които съм попадал. Въпреки че обичаме често да използваме TOP и LIMIT, се препоръчва да продължим да използваме логиката, която работи в множество релационни бази данни.
Ето други публикации в блога, които може да ви бъдат интересни:
- SQL SERVER – Изключване на опцията за конфигурация на сървъра с приоритет за усилване на SSMS 18 по-нататък
- SQL SERVER – Примерен скрипт за проверка на фрагментацията на индекса с RowCount
- SQL пъзел – Създаване на схема и таблица – Отговор без изпълнение на код
- Как да разбера дали индексът е принуден при заявка? – Въпрос за интервю на седмицата #246