Distinct oracle чем заменить

Обновлено: 06.07.2024

Когда я использую Distinct для удаления повторяющихся значений, SQL упорядочивает результат, как показано ниже, но я не хочу, чтобы он сортировался.

Я хочу этот результат без повторяющихся значений и без сортировки

Если вы не можете изменить фактическую структуру таблицы, я могу придумать только один способ добиться этого - использовать временную таблицу или переменную таблицы. В моей тестовой настройке ниже я выбрал последнее.

Сначала вам нужен столбец IDENTITY , чтобы «хранить» порядок вещей:

Затем вы заполняете это, используя порядок вещей как есть (без ORDER BY ):

Теперь, если у нас есть это, мы можем внести некоторую магию, используя ROW_NUMBER() , который в этом случае используется, чтобы выбрать только первый элемент из каждой серии идентификаторов OfficeID:

Обратите внимание, что мне нужно ORDER BY @TempTable.TempID , чтобы сохранить исходную сортировку.

Мой результат теста:

Вы использовали GROUP BY , чтобы удалить дублирующееся значение без использования отдельной функции.

Группировать по - лучший.

Попробуйте этот запрос.

Я нахожу решение:

Я должен использовать столбец IDENTITY для временной таблицы

Таблицы SQL представляют неупорядоченные наборы. Там нет порядка, если столбец не определяет порядок.

Если ваша временная таблица имеет только один столбец, то нет способа гарантировать первоначальный порядок. , , потому что это не определено.

Что вы можете сделать, так это определить временную таблицу с двумя столбцами. Если вы определяете таблицу явно:

И затем вставьте как обычно:

Или, если вы создаете таблицу, используя into , то:

В обоих случаях столбец идентификаторов фиксирует порядок вставки.

Тогда то, что вы хотите сделать, легко:

Вы можете просто поставить это в конце запроса:

Здесь первичный ключ является первичным ключом таблицы. Это сделает ваши результаты не отсортированными.

и я хочу получить все уникальные значения profession поле, что было бы быстрее (или рекомендуется):

они по существу эквивалентны друг другу (на самом деле это как некоторые базы данных реализации DISTINCT под капотом).

если один из них быстрее, это будет DISTINCT . Это связано с тем, что, хотя оба они одинаковы, оптимизатор запросов должен был бы поймать тот факт, что ваш GROUP BY не использует никаких членов группы, только их ключи. DISTINCT делает это явным, поэтому вы можете уйти с немного более тупым оптимизатором.

когда в сомнении, тест!

если у вас есть индекс на profession эти два слова-синонимы.

если нет, то используйте DISTINCT .

GROUP BY на MySQL результаты разные. Вы даже можете сделать:

и получить ваши профессии отсортированы в DESC порядок.

DISTINCT создает временную таблицу и использует его для хранения дубликатов. GROUP BY делает то же самое, но сортирует различные результаты впоследствии.

быстрее, если у вас нет индекса на profession .

перейти на самый простой и короткий, если вы можете -- DISTINCT, кажется, больше того, что вы ищете только потому, что он даст вам именно тот ответ, который вам нужен, и только это!

все ответы выше верны, для случая DISTINCT на одном столбце vs GROUP BY на одном столбце. Каждый движок БД имеет свою собственную реализацию и оптимизацию, и если вы заботитесь о очень маленькой разнице (в большинстве случаев), то вам нужно протестировать против конкретного сервера и конкретной версии! Как реализации могут измениться.

но, если вы выбираете более одного столбца в запросе, то DISTINCT существенно отличается! Потому что в этом случае это будет сравнить все столбцы всех строк, а не только один столбец.

Так что если у вас есть что-то вроде:

Это распространенная ошибка думать, что ключевое слово DISTINCT различает строки по первому столбцу, который вы указали, но DISTINCT является общим ключевым словом таким образом.

таким образом, люди, Вы должны быть осторожны, чтобы не принимать ответы выше как правильные для всех случаев. Вы можете запутаться и получить неправильные результаты, в то время как все, что вы хотели, было оптимизация!

well distinct может быть медленнее, чем group by в некоторых случаях в postgres (не знаю о других dbs).

Так что будьте осторожны . :)

группы по дороже, чем отличие с группой не на результат, а особым избегает его. Но если вы хотите сделать group BY дать тот же результат, что и distinct give порядок по null ..

равна

похоже, что запросы не совсем одинаковы. По крайней мере для MySQL.

  1. опишите выберите отдельное имя продукта из northwind.продукты
  2. опишите выберите productname из northwind.Products group by productname

второй запрос дает дополнительно "использование filesort" в Extra.

на в MySQL," Group By " использует дополнительный шаг: filesort . Я понимаю DISTINCT быстрее GROUP BY и это был сюрприз.

(более функциональное Примечание)

есть случаи, когда вам нужно использовать GROUP BY, например, если вы хотите получить количество сотрудников на работодателя:

в таком случае DISTINCT u.employer работает неправильно. Возможно, есть способ, но я просто не знаю его. (Если кто-то знает, как сделать такой запрос с DISTINCT, пожалуйста, добавьте Примечание!)

Если вам не нужно выполнять какие-либо групповые функции (sum, average и т. д., Если вы хотите добавить числовые данные в таблицу), используйте SELECT DISTINCT. Я подозреваю, что это быстрее, но у меня нет ничего, чтобы показать это.

в любом случае, если вы беспокоитесь о скорости, создать индекс по столбцу.

после тяжелых испытаний мы пришли к выводу, что GROUP BY быстрее

выберите sql_no_cache opnamegroep_intern От telwerken Где opnemergroep IN (7,8,9,10,11,12,13) группа по opnamegroep_intern

635 totaal 0.0944 сек Weergave van records 0-29 (635 totaal, query duurde 0.0484 sec)

выберите sql_no_cache distinct (opnamegroep_intern) От telwerken Где opnemergroep IN (7,8,9,10,11,12,13)

635 totaal 0.2117 секунд ( почти 100% медленнее ) Weergave van records 0-29 (635 totaal, query duurde 0.3468 sec)

для каждого запроса . попробуйте отдельно, а затем группируйте . сравните время, чтобы завершить каждый запрос и использовать быстрее .

в моем проекте когда-то я использую group by и другие distinct

вот простой подход, который будет печатать 2 разных времени для каждого запроса.

Он просто отображает количество миллисекунд, необходимых для анализа, компиляции и выполнения каждого оператора, как показано ниже:

SELECT DISTINCT всегда будет одинаковым или быстрее, чем GROUP BY. В некоторых системах (например, Oracle) он может быть оптимизирован так же, как и для большинства запросов. На других (например, SQL Server) это может быть значительно быстрее.

Если проблема позволяет это, попробуйте с EXISTS, так как она оптимизирована для завершения, как только результат будет найден (и не буферизуйте какой-либо ответ), поэтому, если вы просто пытаетесь нормализовать данные для предложения WHERE, как это

LISTAGG ошибка
Здравствуйте, помогите пожалуйста с проблемой. Возникла ошибка Ora-01489 (слишком длинная.

distinct
Заметил, что это функция меняет исходный порядок следования в столбцах. Возможного ли ею.

DISTINCT
Помогите пожалуйста с DIstinct. Есть таблица TABL, у которой поля tid, tfam, tim. Пробую: .


Distinct по полю
Всем добрый вечер. Скажите пожалуйста. есть таблица id name 1 Морковка это овощ 1 Овощ.

т.е. уже на входе получать уникальные данные, либо примерить вместо LISTAGG другую функцию. Можно кривую малоизвестную WM_CONCAT, которая уже дружит с distinct:
Заменить
Говорит что ORA-00904: "ES"."PHONE_NUMBER": invalid identifier
а если использую WM_CONCAT такая ж ошибка, только уже про WM_CONCAT Так разве не работает? Если первоначальный вариант работал, то и этот должен. Jefe, неа. у меня oracle 11g express edition. Может по этой причине?
а так вообще пишет ошибку
ORA-00904: "WM_CONCAT": invalid identifier Jefe, неа. у меня oracle 11g express edition. Может по этой причине?

Странно конечно, функция в 10g появилась.

Добавлено через 16 минут

Пользователь WMSYS вообще есть? В all_objects есть объект с OBJECT_NAME = 'WM_CONCAT'? Да и её лучше не трогать лишний раз.
Ради костыля можно как-то так попробовать:
По-хорошему лучше запрос переписать, чтобы он без дублей был.

KuKu, Jefe, не..работает)
Что касается WM_CONCAT, его нет в all_objects, и когда я пользовалась 10g express edition тоже не было) прост версии express edition обделили.

Запрос очень хочу переписать, прост мозгов не хватает.
Хочу сделать сначала прост выборку всех полей с помощью временной таблицы(subquery_factoring_clause ), т.е. без агрегатных функций.
Потом как то надо отсеять дубли в поле сити. именно здесь провал.
а затем уже запрос со всеми агрегатными функциями.

Добавлено через 1 час 15 минут
все решила задачу! спасибо за обсуждение)

INSERT INTO Distinct
Есть SQL-запрос: INSERT INTO ( , ) SELECT Work, Date FROM ABC; Беда в том, что он добавляет.

Distinct и COUNT
Добрый вечер Есть таблица с именами юзеров. Юзеры могут повторятся. Как сделать.


Distinct() не работает
public class RouteRel : IEquatable&lt;RouteRel&gt; < public long Id < get; set; >public.

Метод Distinct
Обьясните, почему на обьектах класса string этот метод вызывается а на обьектах класс Array не.

Я пытаюсь использовать LISTAGG функцию в Oracle. Я хотел бы получить только отдельные значения для этого столбца. Есть ли способ получить только отдельные значения без создания функции или процедуры?

Мне нужно выбрать col1 и LISTAGG col2 (столбец 3 не рассматривается). Когда я это делаю, я получаю что-то вроде этого в результате LISTAGG : [2,2,3,4,5]

Мне нужно удалить здесь дубликат «2»; Мне нужны только различные значения col2 против col1.

Можете ли вы показать ожидаемые результаты (строки) из образца? Что вы хотите увидеть, если для col1 существует более одного значения? Ожидаемый результат LISTAGG - [2,3,4,5]. Вторую цифру «2» следует удалить. А в моей таблице более 1000 строк. Что вы хотите видеть, если для col1 существует более одного значения? Код выглядит следующим образом: - ВЫБЕРИТЕ col1, LISTAGG (col2, ',') внутри группы (порядок по col2) ИЗ таблицы T WHERE . Итак, он должен показать все различные значения col2, соответствующие col1, разделенные запятая.

19c и позже:

18c и ранее:

Если вам нужно больше столбцов, возможно, вы ищете что-то вроде этого:

Подобно тому, что я имел в виду. Если listagg это единственная агрегатная функция в запросе, это должно быть сделано. Однако объединить его с другими агрегатными функциями сложнее. @a_horse_with_no_name: приведенный выше оператор select дает мне повторяющиеся значения. Я хочу удалить дубликаты. col1 col2 Создано 1 2 Smith 1 2 John 1 3 Ajay 1 4 Ram 1 5 Jack Мне нужно выбрать col1 и LISTAGG col2 (столбец 3 не рассматривается). Пока я это сделаю, я получу что-то вроде этого в результате LISTAGG: -> [2,2,3,4,5] Мне нужно удалить здесь дубликат '2'. Мне нужны только отдельные значения col2 против col1 .

Вот как решить вашу проблему.

От oracle 19C он встроен см. Здесь

Начиная с 18C, попробуйте в группе см. Здесь

В противном случае используйте регулярные выражения

Примечание. Вышеупомянутое будет работать в большинстве случаев - список должен быть отсортирован, вам может потребоваться обрезать все конечные и ведущие пробелы в зависимости от ваших данных.

Если у вас много элементов в группе> 20 или большие размеры строк, вы можете столкнуться с ограничением размера строки Oracle «результат конкатенации строк слишком длинный».

Из oracle 12cR2 вы можете подавить эту ошибку, см. Здесь . В качестве альтернативы укажите максимальное количество членов в каждой группе. Это будет работать только в том случае, если можно указать только первых участников. Если у вас очень длинные переменные строки, это может не сработать. вам придется поэкспериментировать.

Читайте также: