у меня есть стол
В результате я ожидаю только два столбца Имя и адрес, для add1 и aad2, если они похожи, я хочу показать их только один раз по адресу, а для разных aad1 и add2 я хочу показать их дважды в двух разных строках. Я ожидаю этот вывод
Портативный подход использует union all
, чтобы развернуть столбцы в строки и удалить дубликаты:
select name, add1 as add from mytable
union all select name, add2 from mytable where add2 <> add1
В зависимости от вашей базы данных может быть лучший вариант. Типичным решением является боковое соединение, но синтаксис сильно зависит от базы данных (и не все из них реализуют эту функцию).
Обновлено: в SQL Server:
select t.name, a.add
from mytable t
cross apply (values (add1), (case when add1 <> add2 then add2 end)) a(add)
where a.add is not null
чувак, это сработало, я не знаю, как, но это сработало, спасибо!!
Добро пожаловать @shubham. Поскольку вы, наконец, отметили свой вопрос SQL Server, я добавил (лучшее) решение для этой базы данных.
извините за поздний ответ новое о переполнении стека
В базе данных oracle и sql-сервере оператор объединения удаляет повторяющиеся строки
select name, add1 as address from mytable
union
select name, add2 from mytable
Мне нравится отменять поворот с помощью cross apply
. В вашем случае вы можете использовать такую логику:
select t.name, v.add
from t cross apply
(values (1, add1), (2, add2)) v(n, add)
where n = 1 or (n = 2 and t.add1 <> t.add2);
То есть всегда брать первый адрес. Возьмите второй, когда он отличается от первого.
Пожалуйста, укажите в своем вопросе базу данных, с которой вы работаете: mysql, oracle, sqlserver...?