SELECT Name FROM (
SELECT Name, ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name ) AS Row
FROM T1
UNION
SELECT Name, ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name ) AS Row
FROM T2
) x
ORDER BY Name
为了看看这是怎么回事,我们加上两个 B 行到 T2 然后执行以下操作:
SELECT Name, ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name ) AS Row
FROM T1
Name Row
A 1
A 2
B 1
C 1
SELECT Name, ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name ) AS Row
FROM T2
Name Row
A 1
B 1
B 2
D 1
E 1
现在 UNION 他们没有 ALL 要合并并消除重复项:
SELECT Name, ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name ) AS Row
FROM T1
UNION
SELECT Name, ROW_NUMBER() OVER ( PARTITION BY Name ORDER BY Name ) AS Row
FROM T2
6条答案
按热度按时间vmdwslir1#
过滤器
T2
之前UNION ALL
```select col
from T1
union all
select col
from T2
where not exists (select 1 from T1 where T1.col = T2.col)
rslzwgfq2#
假设您希望从每个值重复次数最多的表中获得重复的数量,可以使用
ROW_NUMBER()
窗口功能,通过每个表中的重复集按顺序消除重复项。为了看看这是怎么回事,我们加上两个
B
行到T2
然后执行以下操作:现在
UNION
他们没有ALL
要合并并消除重复项:最后一个查询就是消除
Row
列和排序结果,以确保升序。有关演示,请参见SQLFiddle。
628mspwn3#
sql fiddle演示
xxhby3vn4#
你应该用“union all”而不是“union”“union”删除其他重复记录,“union all”给出所有记录。
对于您的结果,因为我们在“where”中过滤了表2中的交集,所以不需要“union all”
35g0bw715#
我不知道下面的代码是不是好的做法,但它的工作
上面的查询基于t1值过滤值,然后连接两个表值并显示结果。
希望对你有帮助谢谢。
注意:这不是获得结果的更好方法,它会影响你的表现。
我确信我在研究之后更新了更好的解决方案
66bbxpm56#
你想要所有的名字吗
T1
所有的名字都来自T2
除了在T1
.所以你可以用
UNION ALL
对于2个案例和操作员EXCEPT
筛选T2
:请看演示。
结果: