Select distinct access
Ключевое слово DISTINCTROW
Ключевое слово DISTINCTROW в SQL-выражениях используется в Access для ограничения возвращаемых записей. Оно не используется в SQL-языке других баз данных. В Access оно служит для предотвращения вывода дублирующихся записей. Это ключевое слово работает подобно предикату DISTINCT в других реализациях SQL, но действие DISTINCT внутри запроса распространяется только на поля. DISTINCTROW проверяет записи (даже если их полей нет в выражении SELECT).
Команда SELECT
SELECT — это первое слово запроса на выборку или на добавление. Команда SELECT используется для выбора поля (или полей), которое будет выводиться в результате.
После ключевого слова SELECT необходимо указать поля, которые нужно вывести. Если используется больше одного поля, то между полями нужно вставлять запятые:
SELECT Первое_поле, Второе_поле, Третье_поле, . . .
Предикаты SELECT
В выражениях SELECT можно использовать несколько предикатов, приведенных ниже.
Эти предикаты служат для ограничения количества возвращаемых записей. В SQL-выражении их можно использовать с командой WHERE.
Предикат ALL назначен по умолчанию. Он выбирает все записи, которые в выражении SQL удовлетворяет условию WHERE. Указывать его необязательно, поскольку он назначен по умолчанию. Предикат DISTINCT необходимо включать, когда из запроса следует исключить одинаковые записи (рассматриваются только поля, включенные в запрос). Например, при создании запроса, выводящего идентификатор покупателя и день, в который он сделал заказ, нужно использовать следующее SELECT DISTINCT [CustomerlD], [OrderDate]
Если в таблицу Orders помещено два заказа одного покупателя за один день, то в результирующей таблице будет содержаться только одна запись. Предикат DISTINCT указывает Access, что, если отобранные поля содержат одинаковые значения, нужно выводить только одну запись. Даже если на самом деле в таблице Orders есть две различные записи, то отображена будет только одна из них. Предикат DISTINCT проверяет дублирование только для полей, указанных для просмотра.
Предикат DISTINCT предназначен для исключения записей, которые содержат повторяющиеся значения в отобранных полях. Для того чтобы запись была включена в результат выполнения запроса, значения в каждом поле, включенном в инструкцию SELECT, должны быть уникальными.
DISTINCTROW— это предикат, существующий только в Access. Он работает подобно предикату DISTINCT, но с одним большим отличием: DISTINCTROW проверят совпадение в таблице или таблицах всех полей, а не только выбранных. Предикат DISTINCTROW используется для исключения записей, повторяющихся полностью. Он влияет на результат только в том случае, если в запрос включены не все поля из анализируемых таблиц. Предикат DISTINCTROW игнорируется, если запрос содержит только одну таблицу.
Если, например, какому-либо покупателю в таблице Orders соответствуют две различные записи, то при использовании в предыдущем SQL-выражении distinctrow вместо DISTINCT будут выведены обе записи. Предикат DISTINCTROW проверяет совпадение всех полей в таблицах Customers и Orders. Если содержимое каких-либо полей различно (в данном случае — идентификатор заказа), то будут выведены обе записи.
Предикат ТОР, который также характерен только для Access, ограничивает число выводимых записей, удовлетворяющих условию WHERE. Предикат TOP предназначен для возврата определенного числа записей, находящихся в начале или в конце диапазона, описанного с помощью предложения ORDER BY. Например, ТОР 10 выводит только десять первых записей, удовлетворяющих условию WHERE.
Предикат ТОР имеет один необязательный параметр PERCENT (процент), который указывает не количество первых записей, а их процентное отношение к общему числу отобранных записей.
MySQL Distinct
Выражение MySQL DISTINCT используется для выборки уникальных значений из указанных столбцов. В этой статье мы покажем, как применять DISTINCT в MySQL с помощью Workbench и командной строки.
Синтаксис запросов SELECT DISTINCT в MySQL
Базовый синтаксис запросов SELECT DISTINCT :
- DISTINCT : это ключевое слово возвращает уникальные результаты;
- Columns : позволяет выбрать столбцы, из которых будет осуществляться выборка. Это может быть один или несколько столбцов;
- Source : одна или несколько таблиц, присутствующих в базе данных. Используйте ключевое слово JOIN , чтобы соединить несколько таблиц.
Мы собираемся использовать данные, приведенные ниже, чтобы объяснить применение ключевого слова DISTINCT в MySQL на конкретном примере:
DISTINCT-запрос к одному столбцу
В этом примере мы отобразим уникальные записи из столбца education , используя SELECT DISTINCT MySQL . Но сначала выведем все значения из этого столбца:
Теперь я использую ключевое слово DISTINCT :
DISTINCT-запрос к нескольким столбцам
Когда мы используем запрос MySQL DISTINCT по нескольким полям , SELECT вернёт комбинацию нескольких столбцов вместо уникальных отдельных записей. В этом примере мы выберем уникальные записи из столбцов education и profession :
Несмотря на то, что мы использовали ключевое слово DISTINCT в выражении SELECT , из скриншота, приведенного выше видно, что запрос вернул дублирующие результаты внутри каждого столбца, потому что:
- Bachelors и Developer — это уникальная комбинация;
- Bachelors и Programming — это уникальная комбинация и т.д.
Пример DISTINCT-запроса в MySQL – условие WHERE
В этом MySQL DISTINCT примере мы покажем, как его использовать вместе с условием WHERE . Следующее выражение возвратит уникальные значения столбцов education и profession из таблицы customers , в которых годовой доход больше или равен 85000 :
Несмотря на то, что существует 13 уникальных записей с комбинациями столбцов education и profession , 10 записей не соответствуют условию WHERE . Поэтому на скриншоте показано только 5 записей.
Замечание : Выражение DISTINCT в MySQL воспринимает NULL как допустимое уникальное значение. Поэтому используйте любое NOT NULL условие или функцию, чтобы избавиться от этих значений.
DISTINCT или GROUP BY в MySQL
В MySQL DISTINCT наследует поведение от GROUP BY . Если вы используете выражение GROUP BY без агрегатной функции, то оно будет выполнять роль ключевого слова DISTINCT .
Единственное отличие между ними заключается в следующем:
- GROUP BY сначала сортирует данные, а затем осуществляет группировку;
- Ключевое слово DISTINCT не выполняет сортировки.
Если вы используете ключевое слово DISTINCT вместе с выражением ORDER BY , то получите тот же результат, что и при применении GROUP BY . Следующий запрос возвращает уникальные значения столбца profession из таблицы customerdetails :
Уберём ключевое слово DISTINCT и используем выражение GROUP BY :
Как видите, запрос возвращает тот же результат, но в другом порядке:
В этом MySQL SELECT DISTINCT примере я использую выражение ORDER BY :
Результат тот же, что и при использовании GROUP BY :
Пример DISTINCT-запроса в MySQL – командная строка
Теперь я покажу, как отобразить уникальные записи с помощью SELECT DISTINCT MySQL в командной строки. В этом случае мы выбираем записи с уникальными значениями столбцов education и profession из таблицы customerdetails :
Данная публикация представляет собой перевод статьи « MySQL Distinct » , подготовленной дружной командой проекта Интернет-технологии.ру
Зарезервированные слова DISTINCTROW и DISTINCT
Зарезервированные слова DISTINCTROW и DISTINCT в инструкции SELECT Jet SQL позволяют исключить из результирующего множества повторяющиеся строки. Разница между этими словами состоит в том, как при их использовании определяются повторяющиеся записи.
Если в инструкции SELECT используется слово DISTINCTROW, то для сравнения записей применяются все поля исходной таблицы, независимо от того, какие из этих полей включены в запрос.
Если в инструкцию SELECT входит слово DISTINCT, то для сравнения записей используются данные в строках результирующего множества запроса, т. е. только те поля, которые включены в запрос.
Модификаторы могут использоваться не только в инструкции SELECT, но также и в запросах на добавление записей и на создание таблицы.
Для того чтобы понять, как влияет включение этих слов в запрос на его результат, построим запрос, который будет показывать, какие товары приобрел каждый клиент:
- Создайте новый запрос в базе данных «Борей». Для этого раскройте список запросов окна базы данных и нажмите кнопку Создать (New Query). В списке диалогового окна Новый запрос (New Query) выделите значение Конструктор (Design View) и нажмите кнопку ОК.
- Добавьте в запрос таблицы «Клиенты» (Customers), «Заказы» (Orders), «Заказано» (Orders Details) и «Товары» (Products). Access автоматически создает необходимые связи между таблицами.
- Перетащите поле «Название» (CompanyName) из списка полей таблицы «Клиенты» в первый столбец бланка запроса. Выделите ячейку Сортировка (Sort) и выберите значение По возрастанию (Ascending).
- Перетащите поле «Марка» (ProductName) из списка полей таблицы «Товары» (Products) во второй столбец бланка запроса. Задайте в этом столбце также сортировку по возрастанию.
- Нажмите на панели инструментов кнопку Запуск (Run) для выполнения запроса.
Вы должны получить результирующее множество, которое содержит 2169 записей. При этом те клиенты, которые не сделали ни одного заказа, в результирующее множество .не попадут, однако клиенты, которые заказывали один и тот же товар несколько раз, могут попасть в таблицу несколько раз. Теперь добавим в инструкцию SQI, SELECT слово DISTINCTROW для зтого:
- Выберите команду меню Вид, Режим SQL (View, SQL View) или щелкните по стрелке на кнопке Вид (View) на панели управления и выберите элемент Режим SQL (SQL View). Откроется диалоговое окно, в котором выведена инструкция SQL, соответствующая построенному запросу.
- Введите слово DISTINCTROW сразу после слова SELECT. Запрос должен выглядеть гак, как показано на рис. 8.58.
- Нажмите кнопку Запуск (Run). Результирующее множество запроса будет включать 1695 записей.
- Снова выполните команду Вид, Режим SQL (View, SQL Mode) и замените в инструкции SQL СЛОВО DISTINCTRTOW СЛОВОМ DISTINCT.
- Нажмите кнопку Запуск (Run). Результирующее множество запроса содержит те же 1695 строк, что и при использовании ключевого слова DISTINCTROW.
Рис. 8.58. Инструкция SQL с модификатором DISTINCTROW
В данном случае разницы между употреблением этих модификаторов нет (в других случаях может получиться иной результат). Однако при попытке редактировать данные в таблице вы убедитесь, что при использовании модификатора DISTINCT результирующий набор записей получается необновляемым, а модификатор DISTINCTROW допускает изменение данных в результирующем наборе.
Вместо того чтобы вносить эти модификаторы вручную в режиме SQL, можно просто установить соответствующие свойства запроса. Чтобы открыть диалоговое окно свойств запроса, щелкните правой кнопкой мыши по свободному полю в верхней панели окна Конструктора запроса и выберите из контекстного меню команду Свойства (Properties). Появляется диалоговое окно, представленное на рис. 8.57.
Два свойства в этом окне определяют использование модификаторов DISTINCTROW и DISTINCT: Уникальные значения (Unique Values) и Уникальные записи (Unique Rows). Свойство Уникальные значения соответствует модификатору DISTINCT, a свойство Уникальные записи — модификатору DISTINCTROW. Если вы попробуете установить эти значения, то увидите, что Access не позволит установить значения Да (Yes) для обоих свойств. Если одно из них имеет значение Да (Yes), то для второго автоматически устанавливается значение Нет (No). Если оба свойства имеют значение Нет (No), запрос будет включать в результирующий набор все записи.
Свойство Уникальные записи имеет смысл только для запроса, который строится по нескольким таблицам. Если запрос имеет только одну таблицу, значение этого свойства игнорируется.
Access 2007: «SELECT COUNT(DISTINCT . «
У меня есть таблица, которая содержит StudyId, а PatientId и StudyStartDateTime. Я хотел бы построить график итогов исследований и пациентов между двумя датами, указанными пользователем. Проблема заключается в подсчете различных значений. Вот такой запрос:
Этот запрос работает почти так же, как и должен, за исключением того, что он подсчитывает дубликаты строк с тем же StudyId или тем же PatientId. Я знаю, что Access не поддерживает COUNT (DISTINCT. ), но у меня есть много проблем, чтобы обойти это. Любая помощь была бы очень признательна.
4 Ответов
Вы можете попробовать сделать это с помощью подзапросов для подсчетов, но коррелированные подзапросы, как правило, кусаются, когда речь заходит о производительности.
Если вы готовы сделать это в двух запросах вместо одного, они будут работать:
Обратите внимание, что я добавил подсчитанные поля в группу по выражениям в каждом из них.
Если вы хотите сделать его более «compact», вы можете создать представление для каждого из этих запросов и соединить их с отдельным запросом на StudyStartDateTime, чтобы получить все результаты в одном наборе результатов.
Заметил префикс dbo_-это связано с базой данных сервера SQL?
Если это так, вы можете использовать сквозной запрос и использовать счетчик (DISTINCT . ) синтаксис, как он будет передан непосредственно на сервер SQL.
Поместите это в отдельный ответ, чтобы его можно было проголосовать независимо, но в этой статье блога говорится о том, как сделать это с помощью метода подзапросов:
Я принял предложение JohnFx и создал эти два подзапроса:
И последний вопрос:
Спасибо за всю помощь, и, надеюсь, кто-то еще найдет это полезным!
Похожие вопросы:
Здравствуйте, я уже некоторое время просматривал форум и задаю свой первый вопрос здесь. Я в некотором затруднении и хотел бы узнать, не могу ли я получить какую-нибудь помощь. Я использую Access.
Я использую Microsoft Access 2007. У меня есть два оператора SELECT COUNT (*), которые работают нормально без объединения, но я хочу объединить эти операторы, чтобы использовать их в качестве.
Я просто заметил что-то странное на некоторых из моих Informix SQL столбцов (в той же таблице). Когда я делаю этот запрос SELECT DISTINCT colName FROM myTable Я получаю, например, 40 строк. Но когда.
Я использую Visual basic access 2007 для создания Tool.Now моего застревания, поскольку мне нужно применить distinct к типу данных Memo. Но я получаю ошибку поле слишком мало, чтобы принять объем.
COUNT (SELECT DISTINCT LISTAGG(HANDLING_UNIT_ID, ‘,’) WITHIN GROUP(ORDER BY HANDLING_UNIT_ID) FROM SHIPMENT_LINE_HANDL_UNIT WHERE ORDER_NO = SL.ORDER_NO) AS QUANTITY Может кто-нибудь посоветовать.
Q1: почему count (*) настолько медленнее, чем count (distinct col)? Q2: должен ли id всегда использовать count (distinct col)? select count(id) from source; +————+ | count(id) | +————+.
В HIVE я попытался получить количество различных строк в 2 методах, SELECT COUNT (*) FROM (SELECT DISTINCT columns FROM table); SELECT COUNT (DISTINCT columns) FROM table; И то и другое дает разные.
У меня есть база данных продаж, и я хочу иметь возможность увидеть, что было продано в течение определенного периода времени за эти годы, т. е. увидеть, что было продано больше всего за последние 10.
SELECT DISTINCT bw.Bor_name FROM Borrower AS bw, Loan AS l JOIN Book_Copy AS bc ON l.Bc_id = bc.Bc_id WHERE bw.Bor_id = l.Bor_id GROUP BY l.Bor_id, bc.Bt_id HAVING COUNT( bc.Bt_id ) > 1 AND.
Я пытался написать запрос на основе SQL, используя Count distinct, но столкнулся с проблемами в том, как правильно структурировать формат для Microsoft Access. Мой текущий запрос имеет следующий.
Предикаты ALL, DISTINCT, DISTINCTROW и TOP
Эти предикаты задают записи, выбираемые с помощью запросов SQL.
Синтаксис
SELECT [ALL | DISTINCT | DISTINCTROW | [TOP n [PERCENT]]]
FROM таблица
Инструкция SELECT, содержащая эти предикаты, состоит из следующих частей:
Используется по умолчанию, если вы не указываете ни один из предикатов. Ядро СУБД Microsoft Access выбирает все записи, которые удовлетворяют условиям в инструкции SQL. Следующие два примера эквивалентны и возвращает все записи из таблицы Employees:
Исключает записи, содержащие повторяющиеся данные в выбранных полях. Для включения в результаты запроса значения каждого из полей, перечисленных в инструкции SELECT, должны быть уникальными. Например, у нескольких сотрудников, перечисленных в таблице Employees, могут быть одинаковые фамилии. Если две записи содержат «Глазков» в поле LastName, следующая инструкция SQL возвращает только одну запись, содержащую значение «Глазков»:
Если опустить DISTINCT, этот запрос возвратит обе записи с фамилией «Глазков».
Если предложение SELECT содержит несколько полей, запись будет включена в результаты только в том случае, если сочетание значений всех таких полей уникально.
Выходные данные запроса, использующего DISTINCT, не является обновляемыми и не отражают изменения, внесенные другими пользователями.
Исключает полностью повторяющиеся записи, а не просто записи с повторяющимися полями. Например, вы можете создать запрос, объединяющий таблицы Customers и Orders по полю CustomerID. В таблице Customers нет повторяющихся полей CustomerID, но в таблице Orders они есть, потому что от каждого клиента может быть несколько заказов. Следующая инструкция SQL показывает, как использовать DISTINCTROW для создания списка компаний, которые имеют по крайней мере один заказ. При этом список не будет включать сведения об этих заказах:
Если опустить DISTINCTROW, этот запрос создаст несколько строк для каждой компании, от которой поступало более одного заказа.
DISTINCTROW действует только в том случае, если вы выбираете поля из некоторых (но не всех) таблиц, используемых в запросе. DISTINCTROW игнорируется, если запрос содержит только одну таблицу или вы включаете поля из всех таблиц.
Возвращает записи, относящиеся к верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вы хотите получить имена 25 лучших студентов из группы 1994 г.:
Если не включить предложение ORDER BY, запрос вернет из таблицы Students произвольный набор, включающий 25 записей, которые удовлетворяют предложению WHERE.
Предикат TOP не выбирает между равными значениями. Если в предыдущем примере двадцать пятый и двадцать шестой средний балл совпадают, запрос вернет 26 записей.
Вы также можете использовать зарезервированное слово PERCENT для возвращения определенного процента записей из верхней или нижней части диапазона, заданного предложением ORDER BY. Предположим, что вместо 25 лучших студентов вы хотите получить 10 процентов худших студентов группы:
Предикат ASC позволяет вернуть нижние значения. Значение после TOP должно быть целым числом без знака.
TOP не влияет на возможность обновления запроса.