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

双向校验两张表差异:为何EXCEPT仅返回hotel,需同时返回wc

双向校验poi_equipement与data表的差异数据

当前的EXCEPT语句只能筛选出data表存在但poi_equipement关联结果中没有的记录(也就是缺失数据hotel),没法拿到poi_equipement关联结果存在但data表没有的冗余数据(wc)。要同时返回两类差异并明确来源,推荐两种实现方式:

方法一:使用全外连接(FULL OUTER JOIN)

先把两个表的目标数据单独提取出来,再通过全外连接匹配,筛选出两边不重合的记录,并用CASE标记差异来源:

WITH data_objects AS (
    SELECT object AS item
    FROM data
    WHERE subject = 'url1'
),
poi_subjects AS (
    SELECT e.subject AS item
    FROM poi_equipement pe
    INNER JOIN equipement e ON pe.equipement_id = e.id
)
SELECT 
    COALESCE(d.item, p.item) AS item,
    CASE
        WHEN d.item IS NULL THEN '仅存在于poi_equipement(冗余数据)'
        WHEN p.item IS NULL THEN '仅存在于data(缺失数据)'
    END AS difference_source
FROM data_objects d
FULL OUTER JOIN poi_subjects p ON d.item = p.item
WHERE d.item IS NULL OR p.item IS NULL;

方法二:用UNION ALL结合两次EXCEPT

分别筛选出两类差异,再合并结果:

-- 提取data表有但poi_equipement没有的缺失数据
SELECT 
    object AS item,
    '仅存在于data(缺失数据)' AS difference_source
FROM data
WHERE subject = 'url1'
EXCEPT
SELECT 
    e.subject AS item,
    '仅存在于data(缺失数据)' AS difference_source
FROM poi_equipement pe
INNER JOIN equipement e ON pe.equipement_id = e.id

UNION ALL

-- 提取poi_equipement有但data没有的冗余数据
SELECT 
    e.subject AS item,
    '仅存在于poi_equipement(冗余数据)' AS difference_source
FROM poi_equipement pe
INNER JOIN equipement e ON pe.equipement_id = e.id
EXCEPT
SELECT 
    object AS item,
    '仅存在于poi_equipement(冗余数据)' AS difference_source
FROM data
WHERE subject = 'url1';

两种方法都能同时返回hotel和wc,并清晰标记每条差异属于缺失还是冗余,以及对应的表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:50:20