У меня есть 2 таблицы, каждая из которых содержит 5 уникальных городов. Мне нужны все 10 городов, но я не хочу использовать UNION. Есть ли альтернатива UNION.
SELECT DISTINCT CITY FROM TABLE1
UNION
SELECT DISTINCT CITY FROM TABLE2
А если вы используете UNION, вам не нужен DISTINCT. UNION все равно удаляет дубликаты.
Что ты пытаешься сделать? В чем проблема действительный? Почему вы думаете, что с UNION что-то не так? SELECT CITY FROM TABLE1 UNION SELECT CITY FROM TABLE2 вернет только уникальные значения
Я просто искал альтернативу UNION только для знаний, хотя у меня нет никаких проблем с этим. Это было просто обучение.
Тогда ответ - «нет», альтернативы нет. UNION и UNION ALL выполняют определенные функции. Даже функции, выполняющие аналогичные роли, часто в чем-то отличаются. Например, ISNULL и COALESCE часто считаются очень похожими (или одинаковыми при использовании двух параметров), но на самом деле это не так. На самом деле они могут вести себя по-разному. Например, SELECT ISNULL('a',1); и SELECT COALESCE('a',1); .. Один генерирует ошибку, а другой нет.
есть альтернативы, вы можете написать запрос без UNION, но в этом случае UNION - лучший выбор.
Могут быть альтернативные способы решения конкретных проблем, но когда ваша проблема, которую нужно решить, практически является примером использования UNION, вы не можете ожидать каких-либо разумных альтернатив, которые не просто сильно усложняют задачу.





Вы можете вставить нужные данные во временную таблицу и извлечь их оттуда. Это позволит избежать необходимости в СОЮЗЕ.
SELECT DISTINCT CITY
INTO #City
FROM TABLE1
INSERT INTO #City
SELECT DISTINCT CITY
FROM TABLE2
SELECT DISTINCT City
FROM #City
Это не сработает. UNION удаляет дубликаты, этот код - нет. Даже после проверки существующих значений он просто будет делать то, что делает UNION, самым неэффективным из возможных способов - выполнять три запроса вместо одного и записывать все в tempdb, когда это может легко поместиться в памяти.
Это не самый неэффективный способ. Вы можете использовать курсор, чтобы перебирать каждую таблицу и добавлять по одной строке во временную таблицу ... ;-)
Я просто выполняю его спецификацию;)
Возможно, вы захотите добавить «DISTINCT» в окончательный SELECT. Вы можете получить дубликаты, если есть какое-либо перекрытие городов в TABLE1 и TABLE2 (хотя это не похоже на то, что есть в данный момент, вы не знаете, может ли это измениться в будущем).
Вы можете применить полное внешнее присоединение вместо союза
SELECT DISTINCT ISNULL(t.City,t1.City)
FROM dbo.TABLE1 t
FULL OUTER JOIN dbo.TABLE2 t1 ON t.City = t.City;
Этот запрос дает тот же результат, что и объединение
Хорошее нестандартное мышление!
@ DB101 Большое спасибо
Вот альтернативный способ
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
Спасибо, брат, это то, что я искал.
Если первая таблица обязательно содержит все записи второй таблицы, то можно проверить, можно ли найти идентификатор внутри подзапроса с предложением 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, но может быть полезен в некоторых ситуациях.
Почему вы не хотите использовать
UNION?UNION- подходящий инструмент для этой работы. Зачем использовать молоток для ввинчивания шурупа, если у вас есть также отлично подходящая отвертка?