Oracle distinct не работает
Столкнулся с проблемами с sql-запросом. Он не возвращает отдельные значения,
имея sql-запрос, как указано ниже.
Здесь Maintable есть 20 записей для соответствующего менеджера (100), но только одна запись доступна для нижеуказанных столбцов.
Но когда я выполнял с помощью курсора, он возвращал все 20 строк без учета различных.
Я попытался с запросом ниже, но мне нужен вышеупомянутый формат.
Не могли бы вы сообщить нам, как мы можем этого добиться?
на основе OP он возвращает 20 записей, когда должна быть возвращена только 1. «Отличное» не работает должным образом.
Если вы сможете объяснить, зачем вам нужен исходный «формат», возможно, кто-то сможет понять, как получить желаемые результаты.
Это немного сложно объяснить, но я попытаюсь.
Ваш запрос сравнения
Однако вы используете другой столбец SELECT в DISTINCT . Таким образом, лучшим сравнением было бы:
Вы, вероятно, ожидаете, что DISTINCT будет применяться к значениям, возвращаемым подзапросом. Я предполагаю, что из-за того, как курсор инкапсулирует логику, он применяется к столбцам корреляции, а не к выходным столбцам. Примечание. Я не уверен на 100% в таком поведении, и выражения курсора не очень хорошо документированы.
Я не могу придумать простой способ обойти это поведение.
Я думаю, что это может решить проблему:
из документа: «если выражение курсора появляется в списке выбора, вложенный курсор будет открыт для каждой строки, полученной запросом» . Моя интуиция такова, что он создает новый курсор в каждой строке основного курсора, который является другим адресом, поэтому он уникален для каждой строки. Просто догадываюсь.
@ФлоринГита . . . Это не может быть уникальная строка для комбинации m.Firstname, m.Secondname, m.creation_date , потому что определение вложенного курсора имеет m.MainTable_ID . Вопрос в том, как вложенный курсор разрешается с помощью distinct . Но если у вас есть идея, как обойти эту проблему с вложенным курсором, ОП будет признателен за ваш ответ.
Моя единственная идея состоит в том, чтобы использовать курсор после отдельного, и пользователь должен быть уверен, что он получает правильные строки, прежде чем использовать предложение курсора.
Кажется, какой бы курсор мы ни поместили в отдельное предложение, результаты не будут свернуты (устранены дубликаты). Я пробовал, с cursor(select * from dual) которым не может быть иначе, когда мы меняем строку, но, похоже, это так.
Обходным путем было бы получить отдельные строки перед выбором курсора:
Вы также можете использовать во внутреннем выборе последний запрос из формы вашего вопроса (с левым соединением), чтобы убедиться, что вы получаете правильные отдельные строки.
ОБНОВЛЕНИЕ: Как я уже сказал в комментариях, это всего лишь идея, как обойти проблему. Желаемые строки должны быть подготовлены во внутреннем выборе, а внешний выбор должен использоваться только по причине форматирования (как вы указали).
My problem is I only need distinct a, b, c, d values. When i put distinct on select, statement does not work, it keeps executing and it shows no result.
select distinct d.a, d.b, d.c, d.d
from table d, (select key
from other_table) c
where d.key = c.key
and d.incorrect is null;
What´s wrong? Thanks.
Ответы 3
Ни один из них не является дубликатом; DISTINCT покрывает всю строку. Первая и третья строки в вашем примере имеют разные значения status_id .
- наличие DISTINCT и GROUP BY обычно не является хорошей идеей, если вообще когда-либо.
- частичные GROUP BY (которые не охватывают все неагрегированные поля) не разрешены во многих СУБД и настроены как отключенные по умолчанию в последних выпусках MySQL. Если существует более одного значения для любого из order_updates.order_id date или status_id для одного и того же order_updates.id , то вы фактически получите случайный выбор значений, встречающихся для этих полей.
можешь уточнить? извините, я действительно новичок в sql
DISTINCT используется, когда вы хотите удалить истинные повторяющиеся строки; обычный GROUP BY не должен создавать повторяющиеся строки. Под «нормальным» я подразумеваю отсутствие опций ROLLUP , а поля группировки, включенные в список SELECT. Хотя можно сгруппировать по полям, не включенным в выборку, я бы сказал, что ситуации, когда использование DISTINCT для такого запроса, настолько редки, что любой такой запрос считается подозрительным.
Предположительно вы хотите:
- Все неагрегированные столбцы в SELECT находятся в GROUP BY .
- В запросе используются псевдонимы таблиц, поэтому его легче писать и читать.
- Я предполагаю, что весь порядок в order_updates находится в orders , поэтому я меняю left join на inner join .
- Я удалил идентификатор статуса из group by , потому что он отличается в разных строках.
Предположительно, ваши множественные результаты связаны с тем, что order_updates.id используется в group by . Я не понимаю ни вашего намерения, ни всей структуры данных, поэтому я не знаю, почему это необходимо. Я могу сказать, что если вам нужна одна строка на заказ, то я ожидаю, что orders.id будет в group by .
Спасибо за ответ. однако это по-прежнему возвращает то же самое
@ IonasSkopelitis-Scholte. . . Я удалил status_id . Он отличается в разных строках, и вам, кажется, нужно только самое большое значение.
Я использую пример 8, который спрашивает: «Покажите имена всех игроков, которые забили гол в ворота Германии».
Вот что у меня сейчас есть:
Я ожидал, что результаты будут возвращены только с уникальными именами. Однако это не так, поскольку мы видим, что «Марио Балотелли» указан дважды. Почему в этом случае не работает команда DISTINCT?
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Comments
If you don't specify distinct how many rows you get?
Hi,
Actually DISTINCT gives you the DISTINCT rows, but can't fetch distinct columns value. If your requirement is DISTINCT column values then impletement logic.
What I need it´s only distinct rows. I have executed the query and it works VERY VERY slow. When I don´t use distinct query executes very quickly. Why this difference? Result set has about 40 or 50 rows and I don´t think distinct clause is so heavy.
try this and let me know is this fine with you.
select distict a,b,c,d from (
select d.a a, d.b b, d.c c, d.d d
from table d, (select key
from other_table) c
where d.key = c.key
and d.incorrect is null);
Hi,
Off-course DISTINCT will degrade the performance bcz first it will fetch all the record as per filter conditions and then filter the distinct rows.
SO, this is the difference.
With that query it´s very slow too.
select distict a,b,c,d from (
select d.a a, d.b b, d.c c, d.d d
from table d, (select key
from other_table) c
where d.key = c.key
and d.incorrect is null);
Message was edited by:
i92jurir
How many distinct values of ABCD are there? How many duplicate values are there? How many rows are there in OTHER_TABLE? How many rows in OTHER_TABLE have a value whose KEY matches a value in D?
Distinct values = Maybe 30.
Duplicate = About 10
Rows in OTHER_TABLE = Maybe millions, but query executes very quicly because it´s primary key query.
Key matches between OTHER_TABLE and D = It´s a 1:N relation. 40 or 50 rows.
Out of interest, has this helped you in the end?
Before I spend time re-writing this, would probably help to know if you still have a problem.
My suggestion will be to re-write the whole statement with a MINUS construct. A much brighter man than me once showed me how that can sometimes decimate your query times. it's do with when the parser evaluates the subquery, and whether it will (as your query seems to be doing) scan other_table once for each row that the main query finds.
выше мой код SQL, который я использую. Однако я продолжаю получать дубликаты .. см. Ниже .. Почему это происходит?
Я ожидаю такой результат:
Ваш запрос - неправильный. Если вы используете LEFT JOIN , вы не можете использовать orders.id во внутреннем соединении. Это противоречит цели левого соединения. Вам нужен LEFT JOIN или нет?
Где дубликат? 3 ряда, которые вы наклеили, разные. 'DISTINCT' работает со всей строкой, поэтому в идеале ваш запрос не возвращает дубликатов, поскольку то или иное значение изменяется в каждой строке.
Сначала скажите мне, как вы определяете дубликаты в наборе данных? Кроме того, поделитесь ожидаемым результатом, чтобы мы лучше поняли вопрос.
@MayankPorwal, как видите, я получаю две строки с 1 в качестве значения заказа.
Расскажите, пожалуйста, что такое order_update. Почему это в вашем запросе? Затем отредактируйте свой запрос и уточните все столбцы с их таблицей, например order_items.amount вместо amount .
Два ряда с 1 в качестве order имеют разные status_id , поэтому какой из них вы хотите выбрать? Поймите мою точку зрения, они не дубликаты. :)
Почему вы используете ЛЕВОЕ СОЕДИНЕНИЕ? Чего вы ожидаете от такого использования?
@MayankPorwal, я хочу выбрать отдельные order_id и вернуть наивысший status_id, если это отвечает на ваш вопрос
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно.
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей.
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то.
Ответы 3
DISTINCT работает на уровне записи, поэтому вы должны использовать разные для всей строки или, если вам нужны дополнительные поля для отображения в вашем результате, вам нужно выполнить GROUP BY на плеере и перенести другие поля, присоединившись к сгруппированному результату .
но я считаю, что предполагаемый ответ - это только имя игрока, поэтому запрос будет примерно таким:
«вам нужно выполнить GROUP BY для игрока и привлечь другие поля, присоединившись к сгруппированному результату». Что ты имеешь в виду? Можете ли вы привести пример того, что означает «объединить другие поля путем присоединения к сгруппированному результату»?
на самом деле, если вам нужны только сведения о целях, включая время игрока и гола, а также команды, ваш исходный запрос без директивы DISTINCT достигнет цели. group by - это когда вы хотите агрегировать статистику на основе определенного игрока
Похоже, «Марио Балотелли» может забить несколько голов. Или могут иметь разные составляющие значения от группы 1 и группы 2. Так что попробуйте удалить дополнительные столбцы, которые есть в вашем предложении select.
DISTINCT получает отдельные строки на основе всех выбранных столбцов. Поскольку целевое время различается, выбор этого столбца приведет к тому, что строки будут отличаться друг от друга.
Вопрос только просит вас выбрать имя игрока
Обновлено: если вам нужно более одного столбца, но только отдельный список игроков, которые вы находитесь в сферах агрегации, вы должны min / max / sum / avg другие данные для группы.
Спасибо за ссылку по порядку работы. Предположим, мне нужно более одного столбца в моем операторе выбора. Я читал, что могу использовать «Группировать по» как обходной путь: Однако это тоже, похоже, не работает: ВЫБРАТЬ goal.player, goal.gtime, game.team1, game.team2 FROM game JOIN goal ON ( goal.matchid = game.id) ГДЕ (game.team1 = 'GER' OR game.team2 = 'GER') AND (goal.teamid <> 'GER') ГРУППА ПО goal.player, goal.gtime, game.team1 , game.team2
Допустим, у меня есть имя таблицы TableA со следующими частичными данными:
Я хотел выбрать только 1 строку 5% и 1 строку 2% в качестве представления с помощью DISTINCT, но это не удалось, мой запрос:
Приведенный выше запрос дает мне результат, как показано ниже.
Но это не мой ожидаемый результат, ожидаемый результат mt показан ниже:
Могу ли я узнать, как я могу добиться этого, не указывая какое-либо предложение WHERE? Спасибо!
@a_horse_with_no_name В моей таблице A на самом деле около 500 строк записей, и я не могу использовать предложение WHERE для включения всего lookups_code. Кроме того, я просто хотел, чтобы значение lookup_value было уникальным для моего представления и использовалось в другом запросе, поэтому я думаю, что SELECT DISTINCT может работать в этом случае.
I wanted to select only 1 row of 5% and 1 row of 2% as a view using DISTINCT . На основании предоставленных данных ваш запрос должен работать нормально.
Я думаю, вы неправильно понимаете область действия DISTINCT : это даст вам разные строки , а не только разные в первом поле.
Если вам нужна одна строка для каждого отдельного LOOKUP_VALUE , вам нужно либо WHERE предложение, которое определит, какой из них показывать, либо стратегия агрегирования с GROUP BY предложением и логикой в , SELECT которая сообщает запросу, как агрегировать другие столбцы (например AVG , MAX , , MIN )
Вот мое предположение о вашей проблеме - когда вы говорите
"The above query give me the result as shown in the data table above."
это просто неправда - попробуйте и соответствующим образом обновите свой вопрос.
Я размышляю здесь: я думаю, вы пытаетесь использовать «Отличное», но также выводите другие поля. Если вы запустите:
Тогда ваш вывод будет «одна строка на отдельную комбинацию » из 3 полей.
Вместо этого попробуйте GROUP BY — это позволит вам выбрать Max, Min, Sum других полей, в то же время получая «одну строку на уникальное комбинированное значение» для полей, включенных в GROUP BY.
пример ниже использует вашу таблицу для возврата одной строки на LOOKUP_VALUE, а затем максимальное и минимальное значение оставшихся полей и общее количество записей с использованием ваших данных:
I wanted to select only 1 row of 5% and 1 row of 2%
Это даст наименьшее значение lookups_code для каждого lookup_value :
Вы также можете использовать GROUP BY :
Как насчет функции MIN()
Я считаю, что это работает для желаемого результата, но в настоящее время я не могу его проверить.
Я собираюсь сделать полный снимок в темноте на этом, но из-за того, как вы назвали свои поля, это подразумевает, что вы пытаетесь имитировать vlookup функцию в Microsoft Excel. Если это так, поведение при наличии нескольких совпадений заключается в выборе первого совпадения. Как бы произвольно это ни звучало, так оно и работает.
Если это то, что вы хотите, И первое значение не обязательно самое низкое (или самое высокое, или самое красивое, или что-то еще), то агрегатная функция row_number, вероятно, удовлетворит ваши потребности.
Я предупреждаю вас, что мои критерии упорядочения основаны на номере строки базы данных, который предположительно может отличаться от того, что вы думаете. Если, однако, вы вставите их в чистую таблицу (со сбросом верхней точки), то я думаю, что это довольно безопасная ставка, она будет вести себя так, как вы хотите. Если нет, то вам лучше включить поле явно, чтобы указать, в каком порядке вы хотите, чтобы выбор происходил.
Читайте также: