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

多表相同行比对与更新:修复end_date字段为空的SQL问题

SQL修复:end_date字段未正确赋值的问题

表结构与测试数据

CREATE TABLE old_table (
    name1 VARCHAR(50),
    name2 VARCHAR(50),
    origin_date DATE,
    var1 VARCHAR(50),
    today DATE
);

INSERT INTO old_table (name1, name2, origin_date, var1, today) VALUES
('red_1', 'red', '2010-01-01', 'aaa', '2020-01-01'),
('red_2', 'red', '2011-01-01', 'bbb', '2020-01-01'),
('blue_1', 'blue', '2005-01-01', 'ccc', '2020-01-01'),
('green_1', 'green', '2005-01-01', 'ddd', '2020-01-01');

CREATE TABLE new_table (
    name1 VARCHAR(50),
    name2 VARCHAR(50),
    origin_date DATE,
    var1 VARCHAR(50),
    today DATE
);

INSERT INTO new_table (name1, name2, origin_date, var1, today) VALUES
('purple_1', 'purple', '2001-01-01', 'fff', '2020-01-02'),
('pink_1', 'pink', '2002-01-01', 'ggg', '2020-01-02'),
('red_1', 'red', '2010-01-01', 'aaa', '2020-01-02');

需求说明

  • 基于name1关联两张表,生成status(取值active或inactive)和end_date(取值new_table的today或NULL)
  • 结果需包含两张表的唯一行,区分“消亡”“存活”“新增”数据
  • 存活行:status='active'且end_date=NULL;未存活行:status='inactive'且end_date=new_table.today

原SQL问题分析

原SQL中,LEFT JOIN部分的end_date直接取new_table.today,但当old_table的行在new_table中不存在时,new_table.today为NULL,导致未存活行的end_date不符合预期。需要先获取new_table的统一日期值,用于赋值给未存活行的end_date。

修复后的SQL

WITH new_date AS (
    -- 获取new_table的today日期(因所有行日期一致,取任意一行即可)
    SELECT DISTINCT today AS new_today FROM new_table
),
combined AS (
    SELECT 
        o.name1, 
        o.name2, 
        o.origin_date, 
        o.var1, 
        -- 未存活行用new_table的today,存活行设为NULL
        CASE WHEN n.name1 IS NULL THEN nd.new_today ELSE NULL END AS end_date,
        CASE WHEN n.name1 IS NOT NULL THEN 'active' ELSE 'inactive' END AS status
    FROM old_table o
    CROSS JOIN new_date nd
    LEFT JOIN new_table n ON o.name1 = n.name1
    UNION ALL
    -- 新增行直接设置active和NULL
    SELECT 
        n.name1, 
        n.name2, 
        n.origin_date, 
        n.var1, 
        NULL AS end_date, 
        'active' AS status
    FROM new_table n
    WHERE n.name1 NOT IN (SELECT name1 FROM old_table)
)
SELECT * FROM combined
ORDER BY name1;

验证结果

执行后将得到符合预期的结果:

name1  name2 origin_date var1  status   end_date
    red_1    red  2010-01-01  aaa  active       NULL
    red_2    red  2011-01-01  bbb inactive 2020-01-02
   blue_1   blue  2005-01-01  ccc inactive 2020-01-02
  green_1  green  2005-01-01  ddd inactive 2020-01-02
purple_1 purple  2001-01-01  fff  active       NULL
  pink_1   pink  2002-01-01  ggg  active       NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 07:45:02