- Почему не работает UNION ALL запрос?
- Операторы работы с наборами — UNION (Transact-SQL)
- Синтаксис
- Аргументы
- Примеры
- A. Использование простого UNION
- Б. Использование SELECT INTO с UNION
- В. Использование UNION двух инструкций SELECT с ORDER BY
- Г. Использование UNION трех инструкций SELECT для демонстрации эффекта от использования скобок и ALL
- Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
- Д. Использование простого UNION
- Е. Использование UNION двух инструкций SELECT с ORDER BY
- Ж. Использование UNION двух инструкций SELECT с WHERE и ORDER BY
- З. Использование UNION трех инструкций SELECT для демонстрации эффекта от использования скобок и ALL
- Почему ORDER BY не срабатывает при использовании UNION в mysql?
- 5 ответов 5
- Union не работает sql
Почему не работает UNION ALL запрос?
Необходимо сделать сложную выборку из таблицы с сортировкой для разных условий. Когда делаю два запроса по отдельности то все работает, а если объединяю, то выводит без сортировок — по росту ключевого поля таблицы
В чем может быть проблема?
- Вопрос задан более трёх лет назад
- 427 просмотров
Use of ORDER BY for individual SELECT statements implies nothing about the order in which the rows appear in the final result
Если типы rank_golos и rank_yearnub могут быть приведены к общему виду.
Алекс Иванов, на самом деле самый обычный order by. Сортировать возможно по результату любого вычисления, вот здесь сортировка по 3 вычисляемым полям.
rank_golos >=22.1 desc — дополнительный фокус неявного приведения типов в mysql. Истинное условие — 1, ложное — 0. Что позволяет сортировать как число.
В мануале есть вот такой пример:
Если select поля сортировки делать не надо, то
Полностью допустимый вариант записи, по синтаксису допустимо использовать ORDER BY
Источник
Операторы работы с наборами — UNION (Transact-SQL)
Применимо к: SQL Server (все поддерживаемые версии) База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics Параллельное хранилище данных
Сцепляет результаты двух запросов в один результирующий набор. Вы указываете, будет ли результирующий набор включать повторяющиеся строки:
- UNION ALL — повторяющиеся строки включаются.
- UNION — повторяющиеся строки исключаются.
Операция UNION отличается от операции JOIN :
- В результате операции UNION сцепляются результирующие наборы двух запросов. При этом операция UNION не создает отдельные строки для столбцов, полученных из двух таблиц.
- Операция JOIN сравнивает столбцы из двух таблиц и создает результирующие строки, которые состоят из столбцов из двух таблиц.
Ниже приведены основные правила объединения результирующих наборов двух запросов с помощью операции UNION:
количество и порядок столбцов должны быть одинаковыми во всех запросах;
типы данных должны быть совместимыми.
Синтаксис
Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.
Аргументы
| ( ) Это спецификация запроса или выражение запроса, возвращающее данные для объединения с данными из другой спецификации запроса или выражения запроса. Определения столбцов, которые являются частью операции UNION, не должны совпадать, однако должны быть совместимыми посредством неявного преобразования. Если типы данных различаются, то получившийся тип данных определяется на основе правил очередности типов данных. Если типы одинаковы, но различаются по точности, масштабу или длине, результат определяется на основе тех же самых правил, которые действуют при объединении выражений. Дополнительные сведения см. в разделе Точность, масштаб и длина (Transact-SQL).
Столбцы типа данных xml должны быть эквивалентны друг другу. Все столбцы должны либо иметь тип, определенный в XML-схеме, либо быть нетипизированными. Типизированные столбцы должны относиться к одной и той же коллекции XML-схем.
UNION
Указывает на то, что несколько результирующих наборов следует объединить и возвратить в виде единого результирующего набора.
ALL
Объединяет в результирующий набор все строки, в том числе повторяющиеся. Если обратное не указано, дубликаты строк удаляются.
Примеры
A. Использование простого UNION
При выполнении следующего примера в результирующий набор включается содержимое столбцов ProductModelID и Name таблиц ProductModel и Gloves .
Б. Использование SELECT INTO с UNION
При выполнении следующего примера предложение INTO во второй инструкции SELECT указывает, что в таблице с именем ProductResults содержится итоговый результирующий набор объединения выбранных столбцов таблиц ProductModel и Gloves . Таблица Gloves была создана в результате выполнения первой инструкции SELECT .
В. Использование UNION двух инструкций SELECT с ORDER BY
При использовании предложения UNION необходимо соблюдать порядок следования определенных параметров. В следующем примере показаны случаи правильного и неверного использования UNION в двух инструкциях SELECT , в которых необходимо переименовать столбцы на выходе.
Г. Использование UNION трех инструкций SELECT для демонстрации эффекта от использования скобок и ALL
В следующих примерах предложение UNION используется для комбинирования результатов из трех таблиц, содержащих по 5 одинаковых строк данных. В первом примере используется предложение UNION ALL , в результате чего выдаются все 15 строк. Во втором примере предложение UNION используется без ключевого слова ALL , что позволяет удалить повторяющиеся строки из комбинированного результата выполнения трех инструкций SELECT и вывести только 5 строк.
В третьем примере с первым предложением ALL используется ключевое слово UNION , а во втором предложении UNION вместо ключевого слова ALL используются скобки. Сначала выполняется второе предложение UNION , которое заключено в скобки. В результате возвращаются 5 строк, так как параметр ALL не используется и все повторяющиеся строки удаляются. Полученные 5 строк совмещаются с результатами выполнения первой инструкции SELECT с помощью ключевого слова UNION ALL . В данном случае повторяющиеся строки двух множеств, состоящих из пяти строк, не удаляются. Окончательный результат состоит из 10 строк.
Примеры: Azure Synapse Analytics и Система платформы аналитики (PDW)
Д. Использование простого UNION
При выполнении приведенного ниже примера в результирующий набор включается содержимое столбцов CustomerKey таблиц FactInternetSales и DimCustomer . Так как ключевое слово ALL не используется, повторяющиеся значения не включаются в результаты.
Е. Использование UNION двух инструкций SELECT с ORDER BY
Если какая-либо инструкция SELECT в инструкции UNION содержит предложение ORDER BY, это предложение должно находиться после всех инструкций SELECT. В приведенном ниже примере показаны случаи правильного и неправильного использования UNION в двух инструкциях SELECT , в которых столбец сортируется с помощью предложения ORDER BY.
Ж. Использование UNION двух инструкций SELECT с WHERE и ORDER BY
В приведенном ниже примере показаны случаи правильного и неправильного использования UNION в двух инструкциях SELECT , в которых требуются предложения WHERE и ORDER BY.
З. Использование UNION трех инструкций SELECT для демонстрации эффекта от использования скобок и ALL
В приведенных ниже примерах UNION используется для объединения результатов из той же самой таблицы с целью продемонстрировать эффект от применения ALL и скобок с UNION .
В первом примере UNION ALL используется для вывода повторяющихся записей. Каждая строка из исходной таблицы возвращается три раза. Во втором примере UNION используется без ключевого слова ALL , что позволяет удалить повторяющиеся строки из объединенных результатов выполнения трех инструкций SELECT и вывести только неповторяющиеся строки из исходной таблицы.
В третьем примере с первым оператором UNION используется ключевое слово ALL , а во втором предложении UNION вместо ключевого слова ALL используются скобки. Второе предложение UNION обрабатывается первым, так как оно заключено в скобки. Оно возвращает только неповторяющиеся строки из таблицы, так как параметр ALL не используется и повторяющиеся строки исключаются. Полученные строки объединяются с результатами выполнения первой инструкции SELECT с помощью ключевого слова UNION ALL . В данном случае повторяющиеся строки двух множеств не удаляются.
Источник
Почему ORDER BY не срабатывает при использовании UNION в mysql?
Вопрос по mysql. Какие есть тонкости использования UNION в mysql?
Столкнулся с такой штукой — у меня есть два селекта, первый из них содержит ORDER BY . между селектами UNION стоит. сортировки в первом селекте почему-то НЕ происходит. То есть, выводит без сортировки, и ошибку не выдает никакую.
Создал базу данных
Создал таблицу ukraine
Создал таблицу russia
Объединяю с помощью UNION c ORDER BY, не срабатывает
Объединяю с помощью UNION c ORDER BY, не срабатывает
Объединяю с помощью UNION c ORDER BY, который ставлю в КОНЕЦ, сработало
Вопрос — почему ORDER BY срабатывает только в конце? Он, по идее, он должен срабатывать внутри каждого запроса.
5 ответов 5
Представьте, что каждый подзапрос вставляет данные в некоторую временную таблицу, а потом общий селект эти данные вытягивает. Тогда очевидно, что нет разницы в каком порядке были вставлены. Учитывается только итоговый порядок выборки
Трансформируется в некоторое подобие такого
Тогда понятно, что какие бы ORDER BY Вы не указывали в промежуточных запросах последний селект будет использовать свой порядок сортировки
Вы делаете именно union , не более простой и глупый union all . union без указания какой именно это union выполняет union distinct . Т.е. попытается удалить дубликаты строк из объединяемых множеств.
Обычно это само по себе не то поведение, на что вы рассчитывали и почти всегда когда говорят про union хотят видеть на самом деле union all . Если все строки разные, это просто лишняя операция, если есть совпадающие строки — то их вы потеряете из выборки и это может быть совсем не тем, что вы хотели получить.
И да, поиск дублирующих строк изменяет сортировку набора строк потому что он так сделан.
Фактически union all просто склеит две выборки одну за другой и не затронет сортировку. Не помню исключений для запроса верхнего уровня, но да, это не гарантируется стандартом. Если порядок критично важен то имеет смысл пересортировать после объединения:
Этот запрос гарантированно выдаст сначала записи из таблицы ukraine, отсортированные по названию, затем — из russia, тоже отсортированные по названию.
Источник
Union не работает sql
запрос такого вида работает:
(select . )
union
(select . )
union
(select . )
union
(select . )
order by rand() limit n
добавляюю две скобки (выделены жирным) то перестаёт работать:
(select . )
union
(select . )
union
((select . )
union
(select . )
order by rand() limit n)
Т.е. мне нужна такая логика работы запроса, чтобы order by rand() limit n было применено только к последним двум select -ам.
Как добится такого результата?
Плохиш © ( 2006-04-19 10:39 ) [1]
> добавляюю две скобки (выделены жирным) то перестаёт работать
И ничего, надо думать, не говорит. Документацию читать не пробовал? Эта проблема ни какого отношения к делфи не имеет.
Johnmen © ( 2006-04-19 10:41 ) [2]
Desdechado © ( 2006-04-19 10:45 ) [3]
ORDER BY применяется ко всему результату UNION»ов
Плохиш © ( 2006-04-19 10:48 ) [4]
> Desdechado © (19.04.06 10:45) [3]
> ORDER BY применяется ко всему результату UNION»ов
A http://www.mysql.ru/docs/man/UNION.html не согласен 😉
> VictorT © (19.04.06 10:36)
(select . )
union
(select . )
union
select . from ((select . )
union
(select . )
order by rand() limit n)
Может поможет?
> И ничего, надо думать, не говорит.
Говорит. Малоинформативное сообшение: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
> Документацию читать не пробовал?
Пробовал.
> Эта проблема ни какого отношения к делфи не имеет.
Я задал вопрос в конференции «базы».
> http://www.mysql.ru/docs/man/UNION.html
Вот именно тут первым делом и прочитал. Невижу отсюда, почему не должен работать второй запрос.
Desdechado © ( 2006-04-19 10:54 ) [6]
> Невижу отсюда
Там действительно не очень понятно, хотя
Если для всего результата UNION необходимо применить оператор ORDER BY
при вникании просветляет
Плохиш © ( 2006-04-19 10:56 ) [7]
> Вот именно тут первым делом и прочитал. Невижу отсюда, почему
> не должен работать второй запрос.
Фраза «UNION используется для объединения результатов работы нескольких команд SELECT в один набор результатов.» Про объединение результатов работы нескольких команд UNION там ничего не говориться, так с чего оно должно работать?
VictorT © ( 2006-04-19 10:58 ) [8]
>(select . )
>union
>(select . )
>union
>select . from ((select . )
>union
>(select . )
>order by rand() limit n)
>
> Может поможет?
не понял, что это даёт
Плохиш © ( 2006-04-19 10:59 ) [9]
> не понял, что это даёт
Это даёт
> Фраза «UNION используется для объединения результатов работы
> нескольких команд SELECT в один набор результатов.»
Может попробовать?
> Если для всего результата UNION необходимо применить
>оператор ORDER BY
> при вникании просветляет
Вникал.
> Про объединение результатов работы нескольких команд
> UNION там ничего не говориться, так с чего оно должно
> работать?
Видимо, в этом дело 🙁 Получается, это не решается (без дополнительных таблиц)?
VictorT © ( 2006-04-19 11:28 ) [11]
> Плохиш © (19.04.06 10:59) [9][Ответить]
А, теперь понял. Пробую, пока возникают проблемы с альясом полученной таблицы (в селекте выборка из нескольких таблиц)
VictorT © ( 2006-04-19 12:34 ) [12]
> Плохиш ©
Спасибо огромное, по твоему способу получилось, правда пришлось ещё поиграться.
Источник