【发布时间】:2021-03-22 18:24:30
【问题描述】:
我有一张桌子
结果我希望只有两列名称和地址,对于 add1 和 aad2,如果它们相似,我只想在地址中显示一次,对于不同的 aad1 和 add2,我想在两个不同的行中显示两次 我期待这个输出
【问题讨论】:
-
请用您正在运行的数据库标记您的问题:mysql、oracle、sqlserver...?
标签: sql sql-server duplicates unpivot
我有一张桌子
结果我希望只有两列名称和地址,对于 add1 和 aad2,如果它们相似,我只想在地址中显示一次,对于不同的 aad1 和 add2,我想在两个不同的行中显示两次 我期待这个输出
【问题讨论】:
标签: sql sql-server duplicates unpivot
在oracle数据库和sql-server中,联合运算符删除重复行
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);
也就是说,总是取第一个地址。当第二个与第一个不同时,取第二个。
【讨论】:
一种可移植的方法使用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
【讨论】: