Sql top 1: TOP (Transact-SQL) — SQL Server
Содержание
SQL: MAX против SELECT TOP 1
Я не очень хорошо разбираюсь в SQL, так что простите меня за вопрос новичка. А также для моего базового английского.
Мне нужно извлечь из таблицы значение строки (строк) с максимальной датой. Проблема в том, что я могу выбрать только некоторые строки, и условия будут учитывать также другие таблицы, поэтому, чтобы получить правильные строки, я должен сделать некоторые соединения с этими другими таблицами.
Обычно (используя только одну таблицу) для решения этой проблемы я использую оператор SQL, подобный этому:
SELECT t1.value
FROM table t1
INNER JOIN (SELECT MAX(date) as maxDate
FROM table
WHERE field=3) t2
ON t1.date=t2.maxDate
WHERE t1.field=3
Теперь, в случае, о котором я говорю, мне нужно было бы сделать что-то вроде:
SELECT t1.value
FROM table t1
INNER JOIN otherTable o1 ON o1.key=t1.oKey
INNER JOIN (SELECT MAX(date) as maxDate
FROM table t2
INNER JOIN otherTable o2 ON o2.key=t2.oKey
WHERE t2.field=3 and o2.oField=10) t3
ON t1.date=t3.maxDate
WHERE t1.field=3 and o1.oField=10
Но это решение кажется мне неэффективным, потому что я должен «duplicate» все соединения и условия соединений.
Есть ли другой способ сделать это? Мне не нужно извлекать все результаты (может быть, больше одного), поэтому я тоже подумал об этом решении:
SELECT TOP 1 t.value
FROM table t
INNER JOIN otherTable o ON o.key=t.oKey
WHERE t.field=3 and o.oField=10
ORDER BY t.date DESC
Но я не уверен, что результат будет правильным: сначала он сортирует результаты, а затем выбирает топ-1? Другими словами: могу ли я быть уверен, что строка является той, в которой указана максимальная дата?
Кроме того, действительно ли второй метод более эффективен?
Спасибо вам, ребята!!
sql
sql-server
Поделиться
Источник
Deboroh88
08 июня 2015 в 07:56
2 ответа
- WEB SQL SELECT TOP 1 ошибка
Я постоянно получаю ошибку, когда пытаюсь добавить TOP 1 в свой оператор select. SQL прекрасно работает без TOP 1 , поэтому я подумал, что TOP не поддерживается в WEB SQL, но я не могу найти никакой документации в интернете. Кто-нибудь успешно использовал TOP в своей сети SQL? Это не работает!…
- ANSI SQL версия SELECT TOP 1
Существует ли совместимая с ANSI SQL версия SQL SERVER SELECT TOP n ?
Поделиться
sbiz
08 июня 2015 в 08:47
0
Чтобы ответить на ваш вопрос, select top 1
и max
-это не одно и то же. Select top 1
вернет вам первую строку результирующего набора, не имеет значения, какая дата/данные находятся в этой строке.
Если вы используете select top 1 date from table order by date desc
, вы получите дату max
, так что не беспокойтесь.
Select max(date)
всегда будет давать вам самую высокую дату, или, если быть точным, последнюю дату.
Поделиться
theweeknd
08 июня 2015 в 08:08
Похожие вопросы:
SQL Compact select top 1
При переносе приложения с SQL 2005 на SQL Server Compact Edition я обнаружил, что мне нужно перенести эту команду: SELECT TOP 1 Id FROM tblJob WHERE Holder_Id IS NULL Но SQL Server Compact Edition…
Выберите TOP 1 в SQL Server 6.5
Прошу вас, не спрашивайте меня, почему я использую SQL Server 6.5 В SQL Server 6.5 нет команды SELECT TOP, И знаете что, мне это нужно 🙂 Мне нужно выполнить что-то вроде Select top 1 * from persons…
SQL Server запрос: SELECT 1 где существует против SELECT TOP 1 1
Мне нужно представить флаг-0, если условие не выполняется, 1, если оно выполняется, — и я могу сделать это двумя различными способами : Работник ID, название, 1, Если есть другие в подотряд — 0,…
WEB SQL SELECT TOP 1 ошибка
Я постоянно получаю ошибку, когда пытаюсь добавить TOP 1 в свой оператор select. SQL прекрасно работает без TOP 1 , поэтому я подумал, что TOP не поддерживается в WEB SQL, но я не могу найти никакой…
ANSI SQL версия SELECT TOP 1
Существует ли совместимая с ANSI SQL версия SQL SERVER SELECT TOP n ?
SELECT TOP 1 MAX (DATETIME)
Предположим, у меня есть таблица с именем ‘@DeviceSample’ и другая таблица с именем ‘@DevicesActivityDataSample’. Я хочу SELECT top 1 ‘MAX(DATETIME)’ FROM ‘@DevicesActivityDataSample’ для каждого…
Diff между Top 1 1 и Select 1 в SQL Select Query
У меня есть общее сомнение в sql. Что же на самом деле будет делать Top 1 1 ? В чем смысл приведенного ниже запроса ? select top 1 1 from Worker W where not exists (select 1 from Manager M where…
select top 1 * vs select top 1 1
Я знаю, что есть много таких вопросов, но я не могу найти ни одного, который имел бы отношение к моему вопросу. Глядя на этот вопрос, Имеет ли изменение IF EXIST (SELECT 1 FROM ) на IF EXIST(SELECT…
IF EXISTS (SELECT 1…) vs IF EXITS (SELECT TOP 1 1…)
Это чисто академический вопрос. Являются ли эти 2 утверждения фактически идентичными? IF EXISTS (SELECT TOP 1 1 FROM Table1) SELECT 1 ELSE SELECT 0 Против IF EXISTS (SELECT 1 FROM Table1) SELECT 1…
Запрос SQL, используя MAX() вместо TOP
Я должен взять из таблицы Common_CustomerComments одно описание с максимальным приоритетом (max priority is 3) и max InsertDate Я использовал этот запрос select TOP 1 Description from…
Оператор SQL TOP: примеры, синтаксис
Оператор SQL TOP позволяет ограничить выборку числа записей до заданного числа. При использовании оператора SQL TOP совместно с оператором SQL ORDER BY, на вывод пойдет первые N записей отсортированного списка, в противном случае, выведутся первые N строк таблицы.
Используется только в СУБД MS SQL Server! Аналогом в MySQL является оператор SQL LIMIT.
Оператор SQL TOP имеет следующий синтаксис:
TOP ( N [PERCENT] )
Параметр PERCENT позволяет задать количество строк в процентах. Эта возможность появилась в MS SQL Server 2012.
Примеры оператора SQL TOP. Имеется следующая таблица Artists:
Singer | Album | Year | Sale |
The Prodigy | Invaders Must Die | 2008 | 1200000 |
Drowning Pool | Sinner | 2001 | 400000 |
Massive Attack | Mezzanine | 1998 | 2300000 |
The Prodigy | Fat of the Land | 1997 | 600000 |
The Prodigy | Music For The Jilted Generation | 1994 | 1500000 |
Massive Attack | 100th Window | 2003 | 1200000 |
Drowning Pool | Full Circle | 2007 | 800000 |
Massive Attack | Danny The Dog | 2004 | 1900000 |
Drowning Pool | Resilience | 2013 | 500000 |
Пример 1. Используя оператор SQL TOP вывести первые 4 строки таблицы:
SELECT TOP(4) * FROM Artists
Результат:
Singer | Album | Year | Sale |
The Prodigy | Invaders Must Die | 2008 | 1200000 |
Drowning Pool | Sinner | 2001 | 400000 |
Massive Attack | Mezzanine | 1998 | 2300000 |
The Prodigy | Fat of the Land | 1997 | 600000 |
Пример 2. Используя оператор SQL TOP вывести 3 самых свежих альбома (название и год выпуска):
SELECT TOP(3) Album, Year FROM Artists ORDER BY Year
Результат:
Album | Year |
Resilience | 2013 |
Invaders Must Die | 2008 |
Full Circle | 2007 |
SELECT TOP SQL Server — Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite
В этом учебном пособии вы узнаете, как использовать оператор SELECT TOP в SQL Server (Transact-SQL) с синтаксисом и примерами.
Описание
Оператор SELECT TOP SQL Server (Transact-SQL) используется для извлечения записей из одной или нескольких таблиц в SQL Server и ограничения количества возвращаемых записей на основе фиксированного значения или процента.
Синтаксис
Синтаксис оператора SELECT TOP в SQL Server (Transact-SQL):
SELECT TOP (top_value) [ PERCENT ] [ WITH TIES ]
expressions
FROM tables
[WHERE conditions]
[ORDER BY expression [ ASC | DESC ]];
Параметры или аргументы
TOP (top_value) — возвращает верхнее число строк в результирующем наборе на основе top_value. Например, TOP (10) вернет первые 10 строк из полного набора результатов.
PERCENT — необязательный. Если задан PERCENT, то верхние строки основаны на проценте от общего набора результатов (как указано в верхнем значении). Например, TOP (10) PERCENT вернет верхние 10% полного набора результатов.
WITH TIES — необязательный. Если указано условие WITH TIES, то возвращаются строки, связанные со строкой на последнем месте в ограниченном результирующем наборе. Это может привести к возврату большего количества строк, чем позволяет параметр TOP.
expressions — столбцы или вычисления, которые вы хотите получить.
tables — таблицы, из которых вы хотите получить записи. Должна быть хотя бы одна таблица, перечисленная в предложении FROM.
WHERE conditions — необязательный. Условия, которые должны быть выполнены для выбранных записей.
ORDER BY expression — необязательный. Он используется в операторе SELECT TOP для сортировки записей, которые вы хотите вернуть. ASC в порядке возрастания, а DESC — в порядке убывания.
Пример использования ключевого слова TOP
Давайте посмотрим на пример SQL Server, где мы используем ключевое слово TOP в операторе SELECT.
Например:
SELECT TOP(5)
employee_id, last_name, first_name
FROM employees
WHERE last_name = ‘Samson’
ORDER BY employee_id;
| SELECT TOP(5) employee_id, last_name, first_name FROM employees WHERE last_name = ‘Samson’ ORDER BY employee_id; |
В этом примере SQL Server SELECT TOP были выбраны первые 5 записей из таблицы employees, где last_name – ‘Samson’. Если в таблице employee есть другие записи с last_name ‘Samson’, то они не будут возвращены оператором SELECT.
Вы можете изменить этот пример, включив предложение WITH TIES следующим образом:
SELECT TOP(5) WITH TIES
employee_id, last_name, first_name
FROM employees
WHERE last_name = ‘Samson’
ORDER BY employee_id;
| SELECT TOP(5) WITH TIES employee_id, last_name, first_name FROM employees WHERE last_name = ‘Samson’ ORDER BY employee_id; |
Предложение WITH TIES будет включать строки, которые могут быть связаны со строкой на последнем месте в ограниченном наборе результатов. Поэтому, если с 5-й строкой верхнего набора связаны еще две строки, то все эти связанные строки будут возвращены оператором SELECT TOP. Это приведет к возврату более 7 записей.
Пример использования ключевого слова TOP PERCENT
Рассмотрим пример SQL Server, в котором мы используем ключевое слово TOP PERCENT в операторе SELECT.
Например:
SELECT TOP(10) PERCENT
employee_id, last_name, first_name
FROM employees
WHERE last_name = ‘Samson’
ORDER BY employee_id;
| SELECT TOP(10) PERCENT employee_id, last_name, first_name FROM employees WHERE last_name = ‘Samson’ ORDER BY employee_id; |
Этот пример SQL Server SELECT TOP выберет первые 10% записей из полного набора результатов. Поэтому в этом примере оператора SELECT вернет 10% записей из таблицы employees, где last_name — ‘Samson’. Остальные 90% набора результатов не будут возвращены оператором SELECT.
Вы можете изменить этот пример, включив предложение WITH TIES следующим образом:
SELECT TOP(10) PERCENT WITH TIES
employee_id, last_name, first_name
FROM employees
WHERE last_name = ‘Samson’
ORDER BY employee_id;
| SELECT TOP(10) PERCENT WITH TIES employee_id, last_name, first_name FROM employees WHERE last_name = ‘Samson’ ORDER BY employee_id; |
Предложение WITH TIES будет включать строки, которые могут быть связаны со строкой которая на последнем месте в ограниченном наборе результатов. Поэтому, если есть такие строки в наборе записей SELECT TOP (10) PERCENT, то эти связанные записи будут возвращены оператором SELECT TOP. Это приведет к возврату более 10% от полного набора записей.
SQL Инструкция SELECT TOP, LIMIT, ROWNUM
Обновляется!!! Справочник JavaScript
SQL SELECT TOP
Инструкция SELECT TOP используется для указания количества возвращаемых записей.
Инструкция SELECT TOP полезно для больших таблиц с тысячами записей. Возврат большого количества записей может повлиять на производительность.
Примечание: Не все базы данных поддерживают SELECT TOP.
MySQL поддерживает предложение LIMIT для выбора ограниченного числа записей, в то время как Oracle использует ROWNUM.
Синтаксис SQL Server / MS Access:
SELECT TOP number|percent column_name(s)
FROM table_name
WHERE condition;
Синтаксис MySQL:
SELECT column_name(s)
FROM table_name
WHERE condition
LIMIT number;
Синтаксис Oracle:
SELECT column_name(s)
FROM table_name
WHERE ROWNUM <= number;
Демо база данных
Ниже приведен выбор из таблицы «Customers» в образце базы данных Northwind:
CustomerID | CustomerName | ContactName | Address | City | PostalCode | Country |
---|---|---|---|---|---|---|
1 | Alfreds Futterkiste | Maria Anders | Obere Str. 57 | Berlin | 12209 | Germany |
2 | Ana Trujillo Emparedados y helados | Ana Trujillo | Avda. de la Constitución 2222 | México D.F. | 05021 | Mexico |
3 | Antonio Moreno Taquería | Antonio Moreno | Mataderos 2312 | México D.F. | 05023 | Mexico |
4 | Around the Horn | Thomas Hardy | 120 Hanover Sq. | London | WA1 1DP | UK |
5 | Berglunds snabbköp | Christina Berglund | Berguvsvägen 8 | Luleå | S-958 22 | Sweden |
Примеры SQL TOP, LIMIT и ROWNUM
Следующая инструкция SQL выбирает первые три записи из таблицы «Customers»:
Следующий оператор SQL показывает эквивалентный пример использования предложения LIMIT:
Следующая инструкция SQL показывает соответствующий пример использования параметра ROWNUM:
Пример
SELECT * FROM Customers
WHERE ROWNUM <= 3;
Пример SQL TOP PERCENT
Следующая инструкция SQL выбирает первые 50% записей из таблицы «Customers»:
Добавить WHERE
Следующая инструкция SQL выбирает первые три записи из таблицы «Customers», где страна — «Germany»:
Следующий оператор SQL показывает эквивалентный пример использования LIMIT:
Следующая инструкция SQL показывает соответствующий пример использования параметра ROWNUM:
Пример
SELECT * FROM Customers
WHERE Country=’Germany’ AND ROWNUM <= 3;
Руководство по SQL. Вывод первых результатов. – PROSELYTE
Для того, чтобы получить первые N записей или M процентов записей из таблицы, в языке SQL предусмотрен элемент TOP.
Стоит отметить, что данное ключевое слово поддерживается не всеми базами данных (далее – БД). Например, в RDBMS MySQL для этих целей используется команда LIMIT.
Общий вид данного запроса имеет следующий вид:
SELECT TOP количество|процент имя_колонки(колонок)
FROM имя_таблицы
WHERE [условие];
Для MySQL, подобный запрос будет выглядеть следующим образом:
SELECT колонка1, колонка2 ... колонкаN
FROM имя_таблицы
LIMIT число_записей;
Пример:
Предположим, что у нас есть таблица developers, которая содержит следующие записи:
+----+-------------------+------------+------------+--------+
| ID | NAME | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+------------+------------+--------+
| 1 | Eugene Suleimanov | Java | 2 | 2500 |
| 2 | Peter Romanenko | Java | 3 | 3500 |
| 3 | Andrei Komarov | JavaScript | 3 | 2500 |
| 4 | Konstantin Geiko | C# | 2 | 2000 |
| 5 | Asya Suleimanova | UI/UX | 2 | 1800 |
+----+-------------------+------------+------------+--------+
Допустим ,что нам необходимо получить только первые две записи. Для этого нам необходимо выполнить команду, которая указана ниже:
mysql> SELECT * FROM developers LIMIT 2;
В результате выполнения данного запроса мы получим следующий результат:
+----+-------------------+-----------+------------+--------+
| ID | NAME | SPECIALTY | EXPERIENCE | SALARY |
+----+-------------------+-----------+------------+--------+
| 1 | Eugene Suleimanov | Java | 2 | 2500 |
| 2 | Peter Romanenko | Java | 3 | 3500 |
+----+-------------------+-----------+------------+--------+
На этом мы заканчиваем изучение способов вывода первых записей таблицы.
В следующей статье мы рассмотрим способы сортировки данных, получаемых в результате выполнения запроса.
SQL FIRST () Функция
FIRST () Функция
FIRST () возвращает значение указанного столбца в первой записи.
SQL FIRST) синтаксис (
SELECT FIRST(column_name) FROM table_name;
Примечание: функцию поддерживают только MS Access FIRST ().
SQL Server, MySQL и Oracle в SQL FIRST () место для работы
Синтаксис SQL Server
SELECT TOP 1 column_name
FROM table_name
ORDER BY column_name ASC;
примеров
Выбор TOP 1 имя из веб-сайтов
ORDER BY идентификатором ASC;
синтаксис MySQL
SELECT column_name FROM table_name
ORDER BY column_name ASC
LIMIT 1;
примеров
SELECT name FROM Websites
ORDER BY id ASC
LIMIT 1;
Oracle Синтаксис
SELECT column_name FROM table_name
ORDER BY
column_name ASC
WHERE ROWNUM <=1;
примеров
SELECT name FROM Websites
ORDER BY id ASC
WHERE
ROWNUM <=1;
Демонстрационная база данных
В этом уроке мы будем использовать w3big образец базы данных.
Ниже приводится выбранные «сайты» таблица данных:
+----+--------------+---------------------------+-------+---------+ | id | name | url | alexa | country | +----+--------------+---------------------------+-------+---------+ | 1 | Google | https://www.google.cm/ | 1 | USA | | 2 | 淘宝 | https://www.taobao.com/ | 13 | CN | | 3 | 本教程 | http://www.w3big.com/ | 4689 | CN | | 4 | 微博 | http://weibo.com/ | 20 | CN | | 5 | Facebook | https://www.facebook.com/ | 3 | USA | | 6 | 百度 | https://www.baidu.com/ | 4 | CN | | 7 | stackoverflow | http://stackoverflow.com/ | 0 | IND | +----+---------------+---------------------------+-------+---------+
SQL FIRST () примеры
Следующий SQL заявление выбрать столбец таблицы «Сайты» «имя» первых значений записей:
примеров
SELECT name AS FirstSite FROM Websites LIMIT 1;
реализация SQL из приведенных выше результатов, следующие:
SQL Server SELECT TOP на практических примерах
Резюме : в этом руководстве вы узнаете, как использовать оператор SQL Server SELECT TOP
для ограничения строк, возвращаемых запросом.
Введение в SQL Server
SELECT TOP
Предложение SELECT TOP
позволяет ограничить количество строк или процент строк, возвращаемых в наборе результатов запроса.
Поскольку порядок строк, хранящихся в таблице, не определен, оператор SELECT TOP
всегда используется вместе с предложением ORDER BY
.Следовательно, набор результатов ограничен первым числом упорядоченных строк N
.
Ниже показан синтаксис предложения TOP
с оператором SELECT
:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT TOP (выражение) [PERCENT] [С ГАЛСТАМИ] ИЗ table_name СОРТИРОВАТЬ ПО column_name;
В этом синтаксисе оператор SELECT
может иметь другие предложения, такие как WHERE
, JOIN
, HAVING
и GROUP BY
.
выражение
После ключевого слова TOP
следует выражение, определяющее количество возвращаемых строк. Выражение оценивается как значение с плавающей запятой, если используется PERCENT
, в противном случае оно преобразуется в значение BIGINT
.
PERCENT
Ключевое слово PERCENT
указывает, что запрос возвращает первые N
процентов строк, где N
является результатом выражения
.
WITH TIES
WITH TIES
позволяет возвращать больше строк со значениями, соответствующими последней строке в ограниченном наборе результатов. Обратите внимание, что WITH TIES
может привести к возврату большего количества строк, чем указано в выражении.
Например, если вы хотите вернуть самые дорогие товары, вы можете использовать TOP 1
. Однако, если два или более продукта имеют ту же цену, что и самый дорогой продукт, вы пропустите другие самые дорогие продукты в результирующем наборе.
Чтобы избежать этого, вы можете использовать TOP 1 WITH TIES
. В него войдет не только первый дорогой товар, но и второй и так далее.
SQL Server
SELECT TOP
примеров
Мы будем использовать таблицу production.products
в примере базы данных для демонстрации.
1) Использование
TOP
с постоянным значением
В следующем примере постоянное значение используется для возврата 10 самых дорогих продуктов.
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБРАТЬ ТОП 10 наименование товара, список цен ИЗ производство.продукты СОРТИРОВАТЬ ПО list_price DESC;
Вот результат:
2) Использование
TOP
для возврата процентного значения строк
В следующем примере для указания числа используется PERCENT
продуктов, возвращенных в результирующем наборе. Таблица production.products
имеет 321
строк, поэтому один процент от 321
является дробным значением ( 3,21
), SQL Server округляет его до следующего целого числа, которое составляет четыре ( 4
) в этот случай.
Язык кода: SQL (язык структурированных запросов) (sql)
ВЫБРАТЬ ВЕРХНИЙ 1 ПРОЦЕНТ наименование товара, список цен ИЗ production.products СОРТИРОВАТЬ ПО list_price DESC;
Результат:
3) Использование
TOP WITH TIES
для включения строк, соответствующих значениям в последней строке
Следующий оператор возвращает тройка самых дорогих товаров:
Язык кода: SQL (язык структурированных запросов) (sql)
SELECT TOP 3 WITH TIES наименование товара, список цен ИЗ производство.продукты СОРТИРОВАТЬ ПО list_price DESC;
Результат выглядит следующим образом:
В этом примере цена третьего дорогостоящего продукта составляет 6499,99
. Поскольку в заявлении использовалось TOP WITH TIES
, было возвращено еще три продукта, прейскурантные цены которых совпадают с ценами третьего.
В этом руководстве вы узнали, как использовать оператор SQL Server SELECT TOP
для ограничения количества строк или процента строк, возвращаемых запросом.
Обзор предложения SQL Server TOP и примеры
В этой статье рассматривается предложение TOP в SQL Server на различных примерах. Попутно мы также рассмотрим оптимизацию производительности при использовании предложения TOP в SQL Server.
Введение
Иногда нам нужно получить определенное количество записей из таблицы SQL, а не все записи таблицы. Мы можем использовать предложение WHERE в операторе SELECT, чтобы ограничить количество строк.Предположим, у вас есть таблица клиентов, и вы хотите получить записи для клиентов, принадлежащих к определенной стране. Может быть много записей, удовлетворяющих условию. Для выполнения условий нам требуется максимальное количество записей о клиентах. Для этого требования мы можем использовать предложения TOP или ROW_Number ().
Давайте продолжим и рассмотрим пункт TOP и его аспекты производительности.
Синтаксис предложения SQL Server TOP
SELECT TOP Выражение | Процент [Column_Names] [СО СВЯЗЯМИ]
FROM [Table_Name]
- Выражение : мы можем указать числовое выражение, которое определяет количество возвращаемых строк.
- PERCENT : Здесь мы можем использовать значение PERCENT, чтобы вернуть процентное количество строк от общего количества строк в выходных данных.
- WITH TIES: Мы можем указать предложение WITH TIES, чтобы возвращать больше строк со значениями, соответствующими последней строке в наборе результатов.Например, нам нужны 10 лучших клиентов в зависимости от суммы покупки. Если мы не используем WITH TIES, SQL Server вернет ровно 10 записей, в то время как у нас может быть больше клиентов с аналогичной стоимостью покупки. В этом случае мы можем использовать WITH TIES, чтобы вернуть больше строк. Мы должны использовать WITH TIES вместе с предложением ORDER BY
Давайте рассмотрим несколько примеров предложения SQL Server TOP для таблицы [HumanResources.Employee] в образце базы данных AdventureWorks.
Пример 1: Предложение SQL Server TOP с постоянным значением
В этом примере мы извлекаем 10 первых записей из таблицы SQL без указания каких-либо условий и предложения ORDER BY.
SELECT TOP (10) * FROM HumanResources.Employee; ГО |
Давайте отфильтруем вывод и получим только соответствующие столбцы. Мы можем указать необходимые имена столбцов в операторе выбора.
SELECT TOP (10) NationalIDNumber, JobTitle, BirthDate, HireDate FROM HumanResources.Работник; ГО |
В следующем запросе мы указываем предложение ORDER BY для сортировки результатов в порядке убывания столбца даты рождения.
ВЫБРАТЬ TOP (10) NationalIDNumber, JobTitle, BirthDate, HireDate FROM HumanResources.Employee ORDER BY BirthDate DESC; ГО |
Если мы не укажем предложение DESC, он сортирует результат в порядке возрастания, а верхний оператор показывает требуемые данные.
ВЫБРАТЬ TOP (10) NationalIDNumber, JobTitle, BirthDate, HireDate FROM HumanResources.Employee ORDER BYDATE; ГО |
Пример 2: Предложение TOP со значением PERCENT
Мы можем использовать PERCENT в операторе TOP, чтобы получить N PERCENT строк в выводе.Следующий запрос возвращает 2 процента строк в выходных данных.
SELECT TOP (2) PERCENT NationalIDNumber, JobTitle, BirthDate, HireDate FROM HumanResources.Employee ORDER BYDATE; ГО |
Всего у нас 290 записей в [HumanResources.Работник].
ВЫБРАТЬ СЧЕТЧИК (*) КАК TotalRecords FROM HumanResources.Employee; |
Два процента от 290 составляют 5,8, то есть дробное значение, поэтому SQL Server округляет вывод до шести строк (следующее целое число).
Пример 3: Предложение SQL Server TOP и предложение WITH TIES
В следующем запросе мы извлекаем записи из таблицы SQL в порядке столбца [SickLeaveHours].
ВЫБРАТЬ ТОП (15) * FROM HumanResources.Employee ЗАКАЗАТЬ ПО SickLeaveHours; ГО |
На выходе мы получаем 15 строк, как показано ниже.
Давайте выполним предыдущий запрос, добавив предложение WITH TIES.
ВЫБРАТЬ ТОП (15) СО СВЯЗЯМИ * ОТ HumanResources.Сотрудник ЗАКАЗ ПО SickLeaveHours; ГО |
Мы получаем 18 записей на выходе, несмотря на добавление предложения TOP 15. На выходе у нас есть несколько записей для SickLeaveHours = 22, поэтому предложение WITH TIES добавляет, что все записи имеют одинаковые значения, и теперь мы получаем 18 записей на выходе.
Пример 4: Предложение TOP и оператор SQL Delete
Мы также можем использовать предложение TOP в операторе удаления SQL.Мы должны использовать предложение ORDER BY в операторе удаления, чтобы избежать ненужного удаления данных.
УДАЛИТЬ ИЗ [dbo]. [SalesData] WHERE CustomerId IN (ВЫБРАТЬ TOP 10 CustomerId ИЗ [dbo]. [SalesData] ORDER BY OrderDate ASC); ГО |
В приведенном выше запросе мы хотим получить записи первых 10 клиентов в порядке возрастания [orderdate].Выполните запрос, и он удалил 13 записей. Мы указали пункт TOP 10, поэтому он не должен удалять более 10 записей.
Он может удалить больше записей, если столбец, указанный в предложении TOP, содержит повторяющееся значение. Следовательно, мы должны осторожно использовать оператор удаления с TOP и использовать его только со столбцом первичного ключа.
Пример 5: Предложение TOP и инструкция SQL Insert
Следующий запрос вставляет 10 первых записей из оператора select в таблицу [TempInsert].Во-первых, давайте создадим таблицу SQL с помощью оператора CREATE TABLE с соответствующими типами данных.
СОЗДАТЬ ТАБЛИЦУ TempInsert ([Имя] VARCHAR (50), [Фамилия] VARCHAR (50), [JobTitle] VARCHAR (150) ); INSERT INTO TempInsert ВЫХОД вставлен. [Имя], вставлено. [Фамилия], вставлено.[JobTitle] SELECT TOP 10 [FirstName], [LastName], [JobTitle] FROM [AdventureWorks]. [HumanResources]. [VEmployee] ORDER BY BusinessEntityID DESC; |
Мы используем предложение OUTPUT для отображения записей, вставленных в таблицу TempInsert . Выполнение запроса дает следующий результат. Мы также можем использовать предложение TOP в операторе вставки, но рекомендуется использовать его в операторе Select.Если мы используем его в предложении INSERT, это может вызвать проблемы с производительностью, особенно для большой таблицы.
Пример 6: Предложение SQL Server TOP и оператор SQL UPDATE
Мы также можем использовать предложение TOP в операторе обновления SQL, чтобы ограничить количество строк для обновления. По сути, это комбинация оператора select и update. В следующем запросе мы используем предложение TOP в операторе select и обновляем значения в [HumanResources.Сотрудник] таблица.
ОБНОВЛЕНИЕ HumanResources.Employee SET SickLeaveHours = SickLeaveHours — 10 FROM ( SELECT TOP 10 BusinessEntityID FROM HumanResources 9000 AS7000. Employee.BusinessEntityID = th.BusinessEntityID; ГО |
Пример 7: Предложение TOP в переменной оператора select
Мы можем использовать переменную для определения количества записей в операторе TOP.В следующем запросе мы определили переменную типа int @i и указали для нее значение 10. Позже мы используем эту переменную в предложении TOP.
ЗАЯВИТЬ @i AS INT = 10; SELECT TOP (@i) [FirstName], [LastName], [JobTitle] FROM [AdventureWorks]. [HumanResources]. [VEmployee] ЗАКАЗАТЬ ПО BusinessEntityID DESC; ГО |
Оптимизация производительности для предложения SQL Server TOP
Для этого раздела давайте сгенерируем некоторые тестовые данные и воспользуемся предложением TOP в операторе select.
1 2 3 4 5 6 7 8 9 10 11 12 13 140002 14 18 19 20 | CREATE TABLE TestTable (ID INT PRIMARY KEY CLUSTERED, ZIP INT, Замечания CHAR (3000) ); GO DECLARE @i INT; НАБОР @i = 1; WHILE @i <60000 BEGIN INSERT INTO TestTable VALUES (@i, RAND () * 200000, ‘Sample Data’ ); НАБОР @i = @i + 1; КОНЕЦ; ГО |
Теперь очистите буферный кеш, включите фактический план выполнения в SSMS и выполните следующий запрос.
DBCC FREEPROCCACHE ВЫБРАТЬ ТОП 100 * ИЗ TestTable ГДЕ ID <30000 ЗАКАЗАТЬ ПО ZIP; |
Теперь давайте запустим еще одну инструкцию select после очистки буферного кеша и просмотрим план выполнения.
DBCC FREEPROCCACHE; ВЫБРАТЬ ТОП 1001 * ИЗ TestTable ГДЕ ID <30000 ЗАКАЗАТЬ ПО ZIP; |
План выполнения такой же; однако мы видим предупреждение в операторе сортировки.Оператор сортировки также занял 1,205 секунды по сравнению с 0,112 секунды при предыдущем выполнении.
Как только мы наведем указатель мыши на оператор сортировки, он покажет, что оператор сортировки использовал базу данных tempdb для передачи данных. Он читал и записывал 1977 страниц из разлива tempdb.
Во многих случаях этот оператор сортировки и утечка TempDB могут вызвать проблемы с производительностью, и мы должны устранить его, используя правильные индексы. Мы никогда не должны игнорировать утечку TempDB в плане выполнения запроса.На изображении выше мы видим, что это вызвало утечку данных TempDB из-за столбца ZIP. Это тот же столбец, для которого мы хотим отсортировать данные.
В этом примере давайте создадим некластеризованный индекс для столбца ZIP.
СОЗДАТЬ НЕКЛАСТЕРНЫЙ ИНДЕКС INX_NC_TestTable НА TestTable (ZIP); |
После создания индекса обновите статистику с помощью FULLSCAN , чтобы оптимизатор запросов мог использовать этот вновь созданный индекс.
ОБНОВЛЕНИЕ СТАТИСТИКИ TestTable С FULLSCAN; |
Давайте повторно запустим оператор select, который вызвал утечку данных из TempDB.
DBCC FREEPROCCACHE; ВЫБРАТЬ ТОП 1001 * ИЗ TestTable ГДЕ ID <30000 ЗАКАЗАТЬ ПО ZIP; |
В плане выполнения у нас нет оператора сортировки, и он использует некластеризованное сканирование вместе с поиском по кластеризованному ключу.Это также устранило утечку TempDB.
Заключение
В этой статье мы кратко рассмотрим предложение SQL Server TOP на различных примерах. Мы также рассмотрели дорогостоящий оператор сортировки и его влияние на производительность. Вы всегда должны смотреть на рабочую нагрузку, настраивать запрос и создавать правильные индексы.
Как сертифицированный MCSA и сертифицированный инструктор Microsoft в Гургаоне, Индия, с 13-летним опытом работы, Раджендра работает в различных крупных компаниях, специализируясь на оптимизации производительности, мониторинге, высокой доступности и стратегиях и внедрении аварийного восстановления.Он является автором сотен авторитетных статей о SQL Server, Azure, MySQL, Linux, Power BI, настройке производительности, AWS / Amazon RDS, Git и связанных технологиях, которые на сегодняшний день просмотрели более 10 миллионов читателей.
Он является создателем одного из крупнейших бесплатных онлайн-сборников статей по одной теме с его серией из 50 статей о группах доступности SQL Server Always On. За свой вклад в сообщество SQL Server он постоянно удостаивался различных наград, включая престижную награду «Лучший автор года» в 2020 и 2021 годах на SQLShack.
Радж всегда заинтересован в новых задачах, поэтому, если вам нужна консультационная помощь по любому вопросу, затронутому в его трудах, с ним можно связаться по адресу [email protected]
Просмотреть все сообщения Раджендры Гупты
Последние сообщения Раджендры Гупты ( увидеть все)
SQL SELECT TOP, SQL TOP DISTINCT — с примерами
Как ограничить количество возвращаемых записей в SQL?
Оператор SELECT TOP возвращает указанное количество записей.
SELECT TOP полезен при работе с очень большими наборами данных.
В базах данных, отличных от SQL Server, используются такие ключевые слова, как LIMIT, OFFSET и ROWNUM.
Синтаксис SQL SELECT TOP
Общий синтаксис:
ВЫБЕРИТЕ TOP n имен столбцов ОТ имя-таблицы
ПРОДУКТ | |||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Идентификатор | |||||||||||||||||||||||||||||||||||||||||||
Название продукта | |||||||||||||||||||||||||||||||||||||||||||
Идентификатор поставщика | |||||||||||||||||||||||||||||||||||||||||||
Цена единицы | |||||||||||||||||||||||||||||||||||||||||||
Упаковка | |||||||||||||||||||||||||||||||||||||||||||
Id | Название продукта | ЕдиницаЦена | Пакет |
---|---|---|---|
38 | Кот-де-Блей | 263,50 | Бутылки объемом 12 — 75 мл |
29 | Тюрингер Ростбратвурст | 123,79 | 50 пакетов по 30 сосисок. |
9 | Миши Кобе Нику | 97,00 | 18-500 г уп. |
20 | Мармелад сэра Родни | 81,00 | 30 коробок |
18 | Карнарвон Тайгерс | 62,50 | 16 кг уп. |
59 | Раклетт Курдаво | 55,00 | 5 кг уп. |
51 | Сушеные яблоки Манджимуп | 53,00 | 50-300 г уп. |
62 | Tarte au sucre | 49,30 | 48 пирожков |
43 | Кофе Ипох | 46.00 | 16 — банки по 500 г |
28 | Квашеная капуста Rössle | 45,60 | Банки 25-825 г |
SQL | Предложение SELECT TOP
SQL | Предложение SELECT TOP
Предложение SELECT TOP используется для выборки ограниченного количества строк из базы данных. Этот пункт очень полезен при работе с большими базами данных.
- Базовый синтаксис:
SELECT TOP значение column1, column2 FROM table_name; значение: количество строк, возвращаемых сверху столбец1, столбец2: поля в таблице table_name: имя таблицы
- Синтаксис с использованием процентов
SELECT TOP value PERCENT column1, column2 FROM table_name; Значение : процента от количества строк, возвращаемых сверху столбец1, столбец2: поля в таблице table_name: имя таблицы
Запросы
ПРИМЕЧАНИЕ: Чтобы получить ту же функциональность в базах данных MySQL и Oracle, есть небольшая разница в базовом синтаксисе;
- Эквивалентные синтаксисы следующие:
- Для баз данных MySQL:
SELECT column1, column2 FROM table_name LIMIT value; столбец1, столбец2: поля в таблице table_name: имя таблицы значение: количество строк, возвращаемых сверху
- Для баз данных Oracle:
SELECT column1, column2 FROM table_name WHERE ROWNUM <= value; столбец1, столбец2: поля в таблице table_name: имя таблицы значение: количество строк, возвращаемых сверху
Автор статьи Pratik Agarwal .Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью provide.geeksforgeeks.org или отправить ее по электронной почте на [email protected]. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или если вы хотите поделиться дополнительной информацией по теме, обсуждаемой выше.
Dynamics GP Land: T-SQL: MAX vs. TOP 1
Стив Эндов
Если вам нужно получить наибольшее значение для поля, следует ли использовать MAX в своем запросе? Или вам следует использовать TOP 1 с ORDER BY?
Что лучше? Что быстрее? Это всегда правда?
Как вы думаете, знаете ответ?
Делайте ставки, а затем посмотрите мое видео ниже, где я сравниваю MAX и TOP 1 на нескольких столах Dynamics GP.
Результаты могут вас удивить!
Я что-то пропустил или допустил ошибки при тестировании? Есть ли другие соображения при выборе между MAX и TOP 1?
Вот запросы, которые я использовал в своем тестировании. Обратите внимание, что ваши результаты будут различаться в зависимости от того, сколько данных у вас есть в таблицах и вашей версии SQL Server.
—MAX vs TOP 1 с ЗАКАЗОМ
ОТ
ВЫБРАТЬ МАКС. (ДОК. ДАТА) КАК
ДОКУМЕНТ ОТ PM30200, ГДЕ VENDORID = ‘ACETRAVE0001’
ВЫБЕРИТЕ ТОП-1 ДОКДАТУ ИЗ
PM30200, ГДЕ VENDORID = ‘ACETRAVE0001’ ЗАКАЗАТЬ ПО ДОКДАТЕ DESC
С cteMaxDate (DOCDATE)
В ВИДЕ
ВЫБЕРИТЕ МАКС. (ДОК. ДАТА) ОТ PM10000, ГДЕ VENDORID =
‘ACETRAVE0001’
ВЫБЕРИТЕ МАКС. (ДОК. ДАТА) ОТ PM20000, ГДЕ VENDORID =
‘ACETRAVE0001’
ВЫБЕРИТЕ МАКС. (ДОК. ДАТА) ИЗ PM30200, ГДЕ VENDORID = ‘ACETRAVE0001’
ВЫБРАТЬ МАКС. (ДОК. ДАТА) КАК
DOCDATE FROM cteMaxDate;
С cteMaxDate2
(DOCDATE) КАК
ВЫБЕРИТЕ ТОП 1 ДОКДАТУ ИЗ PM10000, ГДЕ VENDORID =
‘ACETRAVE0001’ ЗАКАЗАТЬ ДОКДАТУ ПО УДАЛЕНИЮ
ВЫБЕРИТЕ ТОП 1 ДОКДАТУ ИЗ PM20000, ГДЕ VENDORID =
‘ACETRAVE0001’ ЗАКАЗАТЬ ДОКДАТУ ПО УДАЛЕНИЮ
ВЫБЕРИТЕ ТОП 1 ДОКДАТУ ИЗ PM30200, ГДЕ VENDORID =
‘ACETRAVE0001’ ЗАКАЗАТЬ ПО ДОКДАТЕ ПО УДАЛЕНИЮ
ВЫБРАТЬ МАКС. (ДОК. ДАТА) КАК
DOCDATE FROM cteMaxDate2;
ВЫБРАТЬ СЧЕТЧИК (*) ИЗ
SEE30303 — 73069 записей
ВЫБЕРИТЕ ТОП-10 * ИЗ
SEE30303
ВЫБРАТЬ МАКС. (ДАТА1) КАК
ДАТА1 ОТ SEE30303 ГДЕ ЭЛЕМЕНТNMBR ВХОДИТ (‘ARM’, ‘FTRUB’, ‘A100′, ’24X IDE’)
ВЫБЕРИТЕ ТОП 1 ДАТУ 1 ИЗ
SEE30303 ГДЕ ЭЛЕМЕНТNMBR IN (‘ARM’, ‘FTRUB’, ‘A100′, ’24X IDE’) ЗАКАЗАТЬ ПО ДАТЕ1
DESC
ВЫБРАТЬ МАКС. (ДАТА1) КАК
ДАТА1 ОТ SEE30303
ВЫБЕРИТЕ ТОП 1 ДАТУ 1 ИЗ
SEE30303 ЗАКАЗАТЬ ПО ДАТЕ1 УДАЛ.
ВЫБРАТЬ МАКС. (ДАТА1) КАК
ДАТА1 ИЗ SEE30303 ВАРИАНТ (MAXDOP 1)
ВЫБЕРИТЕ ТОП 1 ДАТУ 1 ИЗ
SEE30303 ЗАКАЗАТЬ ПО ДАТЕ1 ОПЦИЯ ОПИСАНИЯ (MAXDOP 1)
ВЫБРАТЬ СЧЕТЧИК (*) КАК СТРОК
ОТ IV30500
ВЫБРАТЬ ТОП 100 * ИЗ
IV30500
ВЫБРАТЬ МАКС. (POSTEDDT) КАК
POSTEDDT ОТ IV30500 — ОПЦИЯ (MAXDOP 1)
ВЫБРАТЬ TOP 1 POSTEDDT
ОТ IV30500 ЗАКАЗАТЬ ПО ОПИСАНИЮ POSTEDDT — ОПЦИЯ (MAXDOP 1)
ВЫБРАТЬ МАКС. (POSTEDDT) КАК
POSTEDDT ОТ IV30500 ГДЕ ЭЛЕМЕНТ MBR IN (‘ARM’, ‘FTRUB’, ‘100XLG’) И POSTEDDT
МЕЖДУ ‘2017-01-01’ И ‘2017-12-31’ — ОПЦИЯ (MAXDOP 1)
ВЫБРАТЬ TOP 1 POSTEDDT
ОТ IV30500 ГДЕ ПУНКТ MBR ВХОДИТ (‘ARM’, ‘FTRUB’, ‘100XLG’) И ОТПРАВЛЯЕТСЯ МЕЖДУ
‘2017-01-01’ И ‘2017-12-31’ ЗАКАЗАТЬ ПО POSTEDDT DESC —OPTION (MAXDOP 1)
ВЫБЕРИТЕ МАКС (TRXSORCE) КАК
POSTEDDT ОТ IV30500 ГДЕ ЭЛЕМЕНТ MBR IN (‘ARM’, ‘FTRUB’, ‘100XLG’)
ВЫБЕРИТЕ ТОП 1 TRXSORCE
ОТ IV30500 ГДЕ ТОВАРMBR IN (‘ARM’, ‘FTRUB’, ‘100XLG’) ЗАКАЗАТЬ TRXSORCE
DESC
СОЗДАТЬ НЕКЛАСТЕРНЫЙ ИНДЕКС
NCI_IV30500_ITEMNMBR
ВКЛ [dbo].[IV30500]
([ITEMNMBR])
ПАДЕНИЕ ИНДЕКСА
IV30500.NCI_IV30500_ITEMNMBR
Стив Эндоу — Microsoft MVP в
Лос-Анджелес. Он является владельцем компании Precipio Services, которая предоставляет
Интеграции, настройки и решения для автоматизации Dynamics GP.
Как выбрать первую запись из Oracle с помощью функций PL / SQL.
Как получить первую первую запись от Oracle с помощью PL / SQL
В этой статье объясняется, как использовать функции Oracle для получения первой первой записи с помощью PL / SQL.
Код на этой странице показывает, как использовать Oracle PL / SQL для получения первой первой записи. Вот что мы собираемся объяснить.
- Как получить максимальное значение из таблицы. Другой синтаксис SQL для Oracle 8i, 9i, 10g, 11g и выше.
- Как получить значение из одной ячейки таблицы с помощью функций Oracle.
- Подход PL / SQL с использованием неявного курсора и явного курсора.
Для тестирования функций на этой странице используйте базу данных Oracle Northwind.
который был преобразован из популярной базы данных Access Northwind.
Функция 1:
Эта функция использует команду SELECT … INTO для получения последней даты заказа для клиента с помощью неявного курсора.
Команда SELECT … INTO — это тип скрытого курсора в Oracle PL / SQL (называемый неявным курсором), который позволяет нам пропустить шаги, которые
явный курсор использует, например. объявить курсор, открыть курсор, обработать его строки в цикле, а затем закрыть его.
Следующая функция может использоваться для Oracle 8i и выше.
функция get_latest_order_date (i_curstomer_id в числе) дата возврата является v_order_date дата; начинать выберите Order_Date в v_order_date из ( выберите Order_Date из заказов где customer_id = i_curstomer_id заказать по Order_Date по убыванию ) где rownum <2; - Это гарантирует, что будет возвращена только одна строка.return v_order_date; исключение когда no_data_found, вернитесь к to_date ('01 / 01/1900 ',' DD / MM / YYYY '); конец;
Следующая функция может использоваться для Oracle 9i и выше.
функция get_latest_order_date (i_curstomer_id в числе) дата возврата является v_order_date дата; начинать выберите Order_Date в v_order_date из ( выберите Order_Date, ROW_NUMBER () больше (заказ по Order_Date по убыванию) как row_number из заказов где customer_id = i_curstomer_id заказать по Order_Date по убыванию ) где row_number <2; - Это гарантирует, что будет возвращена только одна строка.return v_order_date; исключение когда no_data_found, вернитесь к to_date ('01 / 01/1900 ',' DD / MM / YYYY '); конец;
Чтобы проверить эту функцию, используйте этот фрагмент кода.
объявлять v_latest_order_date дата; начинать v_latest_order_date: = pkg_task.get_latest_order_date (35); dbms_output.put_line (v_latest_order_date); конец;
ВЫБРАТЬ...INTO вызывает исключение при возникновении любого из следующих двух условий.
- Если базовый запрос возвращает более одной строки, возникает исключение TOO_MANY_ROWS.
Фактическое сообщение об ошибке Oracle: «ORA-01422: точная выборка возвращает больше, чем запрошенное количество строк».
- Если он не возвращает строк, возникает исключение NO_DATA_FOUND.
Функция 2:
Эта функция демонстрирует, как получить последнюю дату заказа с помощью явного курсора.Преимущество использования явного курсора в том, что мы
может проверить, является ли последняя дата заказа значением NULL. Если это значение NULL, это означает, что данные не найдены. Это лучший и краткий способ, чем использование
no_data_found в блоке исключения, как показано в функции 1 выше, особенно когда ваша функция или процедура становятся очень сложными.
Поскольку мы не используем цикл для явного курсора в функции, он всегда возвращает первую запись в курсоре. Это поведение по умолчанию.
функция get_latest_order_date2 (i_curstomer_id в числе) дата возврата является v_order_date дата; курсор latest_order_date (i_curstomer_id в номере) является выберите Order_Date из заказов где customer_id = i_curstomer_id заказ по Order_Date desc; начинать открыть latest_order_date (i_curstomer_id); - Цикл не используется, поэтому выбирается только первая строка.получить latest_order_date в v_order_date; - Здесь мы проверяем значение NULL, чтобы увидеть, найдены ли данные. если v_order_date имеет значение null, тогда return to_date ('01 / 01/1900 ',' ДД / ММ / ГГГГ '); еще return v_order_date; конец, если; закрыть latest_order_date; return v_order_date; конец;
Чтобы проверить эту функцию, используйте следующий фрагмент кода.
объявлять v_latest_order_date дата; начинать v_latest_order_date: = pkg_task.get_latest_order_date2 (3503473); dbms_output.put_line (v_latest_order_date); конец;
Функция 3:
Эта функция является немного измененной версией функции get_latest_order_date2 выше. В этом примере только один
выборка необходима, поэтому нет необходимости в цикле. Однако функция должна проверить, есть ли соответствующая запись
найден до того, как он вернет значение. Это делается с помощью атрибута FOUND.
функция get_latest_order_date3 (i_curstomer_id в числе) дата возврата является v_order_date дата; курсор latest_order_date (i_curstomer_id в номере) является выберите Order_Date из заказов где customer_id = i_curstomer_id заказ по Order_Date desc; начинать открыть latest_order_date (i_curstomer_id); - Если цикл не используется, всегда выбирается первая строка.получить latest_order_date в v_order_date; - Проверьте, можно ли найти соответствующую запись. если latest_order_date% FOUND, то return v_order_date; еще return to_date ('01 / 01/1900 ',' ДД / ММ / ГГГГ '); конец, если; закрыть latest_order_date; конец;
Чтобы проверить эту функцию, используйте следующий фрагмент кода.
объявлять v_latest_order_date дата; начинать v_latest_order_date: = pkg_task.get_latest_order_date3 (3503473); dbms_output.put_line (v_latest_order_date); конец;
Удачного кодирования!
Авторские права © GeeksEngine.com
SELECT TOP 1
Есть много хороших применений метода запросов SELECT TOP 1. По сути, метод select top 1 используется для поиска минимальной или максимальной записи для определенного значения столбца. Существуют некоторые споры относительно того, является ли это «правильным» методом запросов, однако следует знать, что этот метод не нарушает никаких рекомендаций и поддерживается всеми стандартами SQL.
TOP 1 означает возврат только одной записи в качестве набора результатов. какая запись будет возвращена, зависит от столбца, указанного в предложении order by. Если вы хотите найти запись с минимальным значением для определенного столбца, вы должны запросить запись с ORDER BY по возрастанию (ASC). Если вы хотите найти максимальную запись с этим значением, вы должны запросить ее с помощью ORDER BY по убыванию (DESC).
Например, предположим, что вы хотите найти в таблице запись о клиенте, у которого наибольший заказ.Традиционно, способ сделать это - найти максимальное значение заказа, а затем снова присоединиться к таблице, чтобы найти запись. Как следующее:
[cc lang = ”sql”]
ВЫБРАТЬ
*
ИЗ SalesLT.SalesOrderHeader soh
ГДЕ TotalDue =
(
ВЫБРАТЬ МАКС. (TotalDue)
ОТ SalesLT.SalesOrderHeader
ГДЕ SalesOrderCID
ГДЕ SalesOrderID
).
Однако, используя метод запроса SELECT..TOP 1, вы можете выполнить тот же запрос, используя следующую нотацию.
[cc lang = ”sql”]
ВЫБРАТЬ ТОП 1
*
ИЗ SalesLT.SalesOrderHeader
ЗАКАЗАТЬ ПО TotalDue DESC
[/ cc]
Одно из основных отличий состоит в том, что SELECT..TOP 1 всегда будет возвращать только одну запись. Где как объединение против максимума имеет возможность вернуть более одной записи. Это очень важно при установке переменной в SQL Server. Это связано с тем, что установка переменной в SQL Server является скалярной операцией (то есть разрешено возвращать только один результат).
Другой способ выполнить этот метод, который я бы назвал более быстрым, чем оба метода, - использовать SET ROWCOUNT 1.
Еще более спорным является вопрос о том, является ли SET ROWCOUNT подходящим SQL для этого метода запросов, однако, особенно в отношении разбивки на страницы SQL SERVER, ROWCOUNT является самым быстрым методом из всех. Вот альтернативный метод с использованием ROWCOUNT для приведенных выше примеров:
[cc lang = ”sql”]
SET ROWCOUNT 1
ВЫБРАТЬ
*
ИЗ SalesLT.