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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:28:20