Альтернатива UNION в sql server

У меня есть 2 таблицы, каждая из которых содержит 5 уникальных городов. Мне нужны все 10 городов, но я не хочу использовать UNION. Есть ли альтернатива UNION.

SELECT DISTINCT CITY FROM TABLE1
UNION
SELECT DISTINCT CITY FROM TABLE2

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

Larnu 11.07.2018 12:25

А если вы используете UNION, вам не нужен DISTINCT. UNION все равно удаляет дубликаты.

Damien_The_Unbeliever 11.07.2018 12:27

Что ты пытаешься сделать? В чем проблема действительный? Почему вы думаете, что с UNION что-то не так? SELECT CITY FROM TABLE1 UNION SELECT CITY FROM TABLE2 вернет только уникальные значения

Panagiotis Kanavos 11.07.2018 12:30

Я просто искал альтернативу UNION только для знаний, хотя у меня нет никаких проблем с этим. Это было просто обучение.

Nishant Khanna 11.07.2018 12:34

Тогда ответ - «нет», альтернативы нет. UNION и UNION ALL выполняют определенные функции. Даже функции, выполняющие аналогичные роли, часто в чем-то отличаются. Например, ISNULL и COALESCE часто считаются очень похожими (или одинаковыми при использовании двух параметров), но на самом деле это не так. На самом деле они могут вести себя по-разному. Например, SELECT ISNULL('a',1); и SELECT COALESCE('a',1); .. Один генерирует ошибку, а другой нет.

Larnu 11.07.2018 12:40

есть альтернативы, вы можете написать запрос без UNION, но в этом случае UNION - лучший выбор.

Dmitrij Kultasev 11.07.2018 12:41

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

Damien_The_Unbeliever 11.07.2018 12:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
6 806
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете вставить нужные данные во временную таблицу и извлечь их оттуда. Это позволит избежать необходимости в СОЮЗЕ.

SELECT DISTINCT CITY 
INTO #City 
FROM TABLE1

INSERT INTO #City
SELECT DISTINCT CITY 
FROM TABLE2

SELECT DISTINCT City 
FROM #City

Это не сработает. UNION удаляет дубликаты, этот код - нет. Даже после проверки существующих значений он просто будет делать то, что делает UNION, самым неэффективным из возможных способов - выполнять три запроса вместо одного и записывать все в tempdb, когда это может легко поместиться в памяти.

Panagiotis Kanavos 11.07.2018 12:29

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

cf_en 11.07.2018 12:34

Я просто выполняю его спецификацию;)

DB101 11.07.2018 12:35

Возможно, вы захотите добавить «DISTINCT» в окончательный SELECT. Вы можете получить дубликаты, если есть какое-либо перекрытие городов в TABLE1 и TABLE2 (хотя это не похоже на то, что есть в данный момент, вы не знаете, может ли это измениться в будущем).

Gravitate 11.07.2018 12:51

Вы можете применить полное внешнее присоединение вместо союза

SELECT DISTINCT ISNULL(t.City,t1.City)
FROM dbo.TABLE1 t
FULL OUTER JOIN dbo.TABLE2 t1 ON t.City = t.City;

Этот запрос дает тот же результат, что и объединение

Хорошее нестандартное мышление!

DB101 11.07.2018 13:00

@ DB101 Большое спасибо

Mehul Bhalala 11.07.2018 13:02
Ответ принят как подходящий

Вот альтернативный способ

SELECT DISTINCT CASE WHEN a.city is null then b.city else a.city end 
                         FROM Table1 FULL JOIN Table2b ON 1 = 0

он не предлагает преимуществ перед UNION, но вам может быть интересно увидеть FULL JOIN, который имеет сходство с UNION

Спасибо, брат, это то, что я искал.

Nishant Khanna 11.07.2018 13:36

Если первая таблица обязательно содержит все записи второй таблицы, то можно проверить, можно ли найти идентификатор внутри подзапроса с предложением OR.

Я использую ORM-фреймворк, который не поддерживает оператор UNION (Apache OJB), и, исходя из вышеизложенного предположения, эта стратегия оказалась быстрее, чем при использовании FULL OUTER JOIN.

Например, если таблица STUDENT содержит всех студентов провинции / штата с полем для их текущей основной школы, а другая таблица, STUDENT_SECONDARY_SCHOOL, содержит информацию для тех студентов, посещающих вторую школу неполный рабочий день, я могу получить объединение всех студентов, посещающих конкретная школа, полная или неполная, таким образом:

SELECT STD_ID FROM STUDENT 
WHERE 
    STD_SCHOOL='the_school' 
    OR 
    STD_ID IN (SELECT STD_ID FROM STUDENT_SECONDARY_SCHOOL WHERE STD_SCHOOL='the_school')

Опять же, я хочу подчеркнуть, что это НЕТ, эквивалент UNION, но может быть полезен в некоторых ситуациях.

Другие вопросы по теме