SQL查询需求:返回唯一值对应完整行,需显示结果来源信息
解决方案
要获取两个表中Column A出现次数仅为1的完整行,核心思路是先合并两个表的目标数据,再统计每个Column A的出现频次,最后关联筛选出符合条件的行。以下是两种实用方法:
方法1:子查询统计法(兼容多数数据库)
SELECT t.ID, t.Table_ID, t.Column_A FROM ( -- 合并两个表的字段,用表名标记来源Table ID SELECT ID, 'guide_book' AS Table_ID, Column_A FROM guide_book UNION ALL SELECT ID, 'adding' AS Table_ID, Column_A FROM adding ) t INNER JOIN ( -- 统计每个Column_A的总出现次数 SELECT Column_A, COUNT(*) AS cnt FROM ( SELECT Column_A FROM guide_book UNION ALL SELECT Column_A FROM adding ) sub GROUP BY Column_A HAVING cnt = 1 ) cnt_t ON t.Column_A = cnt_t.Column_A;
代码说明:
- 内层第一个子查询通过
UNION ALL合并两个表的ID、自定义的Table_ID(直接用表名标识来源)和Column A,保留所有原始行。 - 第二个子查询统计合并后每个
Column A的出现次数,筛选出次数为1的记录。 - 最后将合并数据集与统计结果关联,得到符合条件的完整行。
方法2:窗口函数法(简洁高效,适用于支持窗口函数的数据库如MySQL 8+、PostgreSQL、SQL Server)
WITH combined_data AS ( SELECT ID, 'guide_book' AS Table_ID, Column_A FROM guide_book UNION ALL SELECT ID, 'adding' AS Table_ID, Column_A FROM adding ) SELECT ID, Table_ID, Column_A FROM ( SELECT *, COUNT(*) OVER (PARTITION BY Column_A) AS cnt FROM combined_data ) t WHERE cnt = 1;
代码说明:
- 先用CTE(公共表表达式)合并两个表的数据,语法更清晰。
- 通过
COUNT(*) OVER (PARTITION BY Column_A)窗口函数,直接计算每个Column A对应的总出现次数,无需分组。 - 最后筛选出次数为1的行即可。
注意事项:
- 确保两个表的
ID字段数据类型一致,若类型不同可通过CAST(ID AS VARCHAR)等方式转换。 UNION ALL会保留所有重复行,性能优于UNION;若需去重完全相同的行,可替换为UNION。
内容的提问来源于stack exchange,提问作者Meije3984
相关产品推荐
相关产品推荐

