Как объединить данные из двух столбцов в один без использования UNION и JOIN?
Полная статья по ссылке: http://exercises-on-sql.blogspot.com/2017/02/union-join.html
Такие
вопросы с завидной регулярностью появляются на страницах различных
форумов. К слову сказать, для меня до сих пор остается загадкой, почему
при этом ставится дополнительное условие не использовать UNION и/или
JOIN. Могу лишь предположить, что это вопросы, которые задают на
собеседовании при приеме на работу.
Лирическое
отступление. Догадываюсь, как ответил бы на этот вопрос Джо Селко:
налицо ошибка проектирования, состоящая в том, что один атрибут
расщеплен на два. Однако оставим в стороне вопросы проектирования и
перейдем к решению этой задачи.
Создадим тестовую таблицу и добавим в нее немного данных:
CREATE TABLE T (
col1 INT
, col2 INT
)
GO
INSERT INTO T
SELECT 1, 1
UNION ALL SELECT 1, 3
UNION ALL SELECT NULL, NULL
UNION ALL SELECT NULL, 2
GO
Итак, имеется таблица T, которая содержит два столбца с данными одного типа:
SELECT col1, col2
FROM T
col1 col2 1 1 1 3 NULL NULL NULL 2
Требуется получить следующий результат:
col 1 1 NULL NULL 1 3 NULL 2
Мне известны три способа, реализуемых стандартными средствами интерактивного языка SQL.
1. UNION ALL
Очевидное решение, не требующее комментариев. Заметим лишь, что UNION не подходит для решения этой задачи, т.к. устраняет дубликаты.
SELECT col1 col FROM T
UNION ALL
SELECT col2 FROM T
2. FULL JOIN
Чтобы не потерять дубликаты, находящиеся в разных столбцах, выполним полное соединение (FULL JOIN) по заведомо ложному предикату, скажем, 1 = 2:
SELECT T.col1,T1.col2
FROM T FULL JOIN T AS T1 ON 1=2
Результат:
col1 col2 1 NULL 1 NULL NULL NULL NULL NULL NULL 1 NULL 3 NULL NULL NULL 2
Далее используем функцию COALESCE, которая даст нам все, что нужно:
SELECT COALESCE(T.col1,T1.col2) col
FROM T FULL JOIN T AS T1 ON 1=2
3. UNPIVOT
Конструкции PIVOT и UNPIVOT появились в последних версиях стандарта SQL и были реализованы SQL Server, начиная с
Комментариев нет:
Отправить комментарий