You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用UNION仅检索指定列中存在重复名称的记录?

实现UNION后仅保留Name列存在重复的记录

嘿,我来帮你搞定这个需求!咱们先理清楚场景:你有Table A和Table B两张表,现在想用UNION合并它们,但只想保留那些Name在合并结果里出现至少两次的记录——也就是说,像Jessy、Jenna这种只在单张表出现一次的Name,对应的行要排除,而Jack、John这种重复出现的Name,所有相关行都要留下。

先看看两张表的原始数据:

Table A

IDNameAgeSex
1Jack20Male
2James18Male
3Jane17Female
4Jessy16Female
5John34Male

Table B

IDNameAgeSex
1Jack21Male
2James18Male
3Jane17Male
4Jenna17Female
5John34Male
6John34Male

核心思路:先合并所有记录,再筛选重复Name的行

这里要注意,不能直接用UNION,因为UNION会自动去重相同的行,可能导致某些Name的出现次数被低估(比如James在两张表完全一样,UNION后只留一行,会误以为Name只出现一次)。所以第一步得用UNION ALL把两张表的所有记录都合并,再统计每个Name的出现次数,最后过滤出次数≥2的记录。

方法1:用窗口函数(简洁又高效)

窗口函数可以直接在合并后的结果里计算每个Name的出现次数,一步到位:

WITH combined_records AS (
    -- 先合并两张表的所有记录,不去重
    SELECT ID, Name, Age, Sex FROM TableA
    UNION ALL
    SELECT ID, Name, Age, Sex FROM TableB
),
name_counts AS (
    -- 给每条记录加上对应Name的总出现次数
    SELECT 
        ID, Name, Age, Sex,
        COUNT(*) OVER (PARTITION BY Name) AS total_occurrences
    FROM combined_records
)
-- 只保留出现次数≥2的记录
SELECT ID, Name, Age, Sex
FROM name_counts
WHERE total_occurrences >= 2;

方法2:用子查询筛选重复Name

如果你不习惯窗口函数,也可以用子查询先找出所有重复的Name,再关联回合并后的结果:

-- 先找出所有在合并后出现≥2次的Name
WITH duplicate_names AS (
    SELECT Name
    FROM (
        SELECT Name FROM TableA
        UNION ALL
        SELECT Name FROM TableB
    ) AS all_names
    GROUP BY Name
    HAVING COUNT(*) >= 2
)
-- 取出这些Name对应的所有记录
SELECT c.ID, c.Name, c.Age, c.Sex
FROM (
    SELECT ID, Name, Age, Sex FROM TableA
    UNION ALL
    SELECT ID, Name, Age, Sex FROM TableB
) AS c
INNER JOIN duplicate_names ON c.Name = duplicate_names.Name;

最终结果

执行上面的语句后,你会得到这样的结果:

IDNameAgeSex
1Jack20Male
1Jack21Male
2James18Male
2James18Male
3Jane17Female
3Jane17Male
5John34Male
5John34Male
6John34Male

可以看到,Jessy和Jenna的记录被排除了,所有Name重复的行都被保留下来啦!

内容的提问来源于stack exchange,提问作者jakealbert

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:35:57