Поделиться через


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 

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.