ALL, DISTINCT, DISTINCTROW, TOP predicates (Microsoft Access SQL)
Область применения: Access 2013 | Access 2016
Указывает записи, выбранные с помощью SQL-запросов.
Синтаксис
SELECT [ВСЕ | | DISTINCT | DISTINCTROW [TOP n [ПРОЦЕНТ]]] ] ТАБЛИЦА FROM
Инструкция SELECT, содержащая эти предикаты, состоит из следующих частей.
ALL: предполагается, если вы не включаете один из предикатов. Ядро СУБД Microsoft Access выбирает все записи, соответствующие условиям в инструкции SQL.
Следующие два примера эквивалентны и возвращают все записи из таблицы Employees:
SELECT ALL * FROM Employees ORDER BY EmployeeID;
SELECT * FROM Employees ORDER BY EmployeeID;
DISTINCT: пропускает записи, содержащие дубликаты данных в выбранных полях. Для включения в результаты запроса значения каждого поля, указанного в инструкции SELECT, должны быть уникальными. Например, несколько сотрудников, перечисленных в таблице Сотрудники, могут иметь одинаковые фамилии. Если две записи содержат Smith в поле LastName, следующая инструкция SQL возвращает только одну запись, содержащую Smith:
SELECT DISTINCT LastName FROM Employees;
Если опустить DISTINCT, этот запрос возвращает обе записи Smith. Если предложение SELECT содержит несколько полей, сочетание значений из всех полей должно быть уникальным, чтобы данная запись была включена в результаты. Выходные данные запроса, использующего DISTINCT, не обновляемые и не отражают последующие изменения, внесенные другими пользователями.
DISTINCTROW: пропускает данные, основанные на всех повторяющихся записях, а не только на повторяющихся полях. Например, можно создать запрос, который объединяет таблицы Customers и Orders в поле CustomerID. Таблица Customers не содержит повторяющихся полей CustomerID, но таблица Orders делает это, так как у каждого клиента может быть много заказов. В следующей инструкции SQL показано, как можно использовать DISTINCTROW для создания списка компаний, у которых есть по крайней мере один заказ, но без каких-либо сведений об этих заказах:
SELECT DISTINCTROW CompanyName FROM Customers INNER JOIN Orders ON Customers.CustomerID = Orders.CustomerID ORDER BY CompanyName;
Если опустить DISTINCTROW, этот запрос создает несколько строк для каждой компании, которая имеет несколько заказов. DISTINCTROW действует только при выборе полей из некоторых, но не всех таблиц, используемых в запросе. DISTINCTROW игнорируется, если запрос содержит только одну таблицу или если вы выводите поля из всех таблиц.
TOP n [PERCENT]: возвращает определенное количество записей, которые попадают в верхнюю или нижнюю часть диапазона, заданного предложением ORDER BY. Предположим, вам нужны имена 25 лучших учащихся из класса 1994 года:
SELECT TOP 25 FirstName, LastName FROM Students WHERE GraduationYear = 1994 ORDER BY GradePointAverage DESC;
Если не включить предложение ORDER BY, запрос вернет произвольный набор из 25 записей из таблицы Students, которые удовлетворяют предложению WHERE. Предикат TOP не выбирает между равными значениями. В предыдущем примере, если двадцать пятый и двадцать шестой средние балл высшей оценки совпадают, запрос вернет 26 записей. Вы также можете использовать зарезервированное слово PERCENT для возврата определенного процента записей, которые попадают в верхнюю или нижнюю часть диапазона, заданного предложением ORDER BY. Предположим, что вместо первых 25 учащихся вам нужны нижние 10 процентов класса:
SELECT TOP 10 PERCENT FirstName, LastName FROM Students WHERE GraduationYear = 1994 ORDER BY GradePointAverage ASC;
Предикат ASC указывает возврат нижних значений. Значение, следующее за TOP, должно быть целым числом без знака. TOP не влияет на то, является ли запрос обновляемым.
table: имя таблицы, из которой извлекаются записи.
Пример
В этом примере создается запрос, который объединяет таблицы Customers и Orders в поле CustomerID. Таблица Customers не содержит повторяющихся полей CustomerID, но таблица Orders делает это, так как у каждого клиента может быть много заказов. С помощью DISTINCTROW создается список компаний, имеющих по крайней мере один заказ, но без каких-либо сведений об этих заказах.
Sub AllDistinctX()
Dim dbs As Database, rst As Recordset
' Modify this line to include the path to Northwind
' on your computer.
Set dbs = OpenDatabase("Northwind.mdb")
' Join the Customers and Orders tables on the
' CustomerID field. Select a list of companies
' that have at least one order.
Set rst = dbs.OpenRecordset("SELECT DISTINCTROW " _
& "CompanyName FROM Customers " _
& "INNER JOIN Orders " _
& "ON Customers.CustomerID = " _
& "Orders.CustomerID " _
& "ORDER BY CompanyName;")
' Populate the Recordset.
rst.MoveLast
' Call EnumFields to print the contents of the
' Recordset. Pass the Recordset object and desired
' field width.
EnumFields rst, 25
dbs.Close
End Sub
См. также
- Форум для разработчиков Access
- Помощь при работе с Access на support.office.com
- Форумы Access на UtterAccess
- Справочный центр (FMS) для разработки и VBA программирования для Access
- Публикации по Access на StackOverflow
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.