如何在Redshift多表JOIN语句中实现优先级取值的CASE条件?
没问题!你现在的核心需求是给demo表的market_num字段填充数据,优先从table1匹配获取,无匹配时再从table2取数,之前分开的两个查询没法实现这种 fallback 逻辑,我给你几个实用的解决方案,分查询和更新两种场景:
场景1:查询匹配后的结果(不修改原表)
方法1:LEFT JOIN + COALESCE(最简单直观)
这种方式通过左连接同时关联两个表,利用COALESCE函数优先取第一个非空的market_num值(也就是table1的结果),如果table1没有匹配到,就自动取table2的结果:
SELECT a.source_country_palce, -- 优先取table1的market_num,为空则取table2的 COALESCE(b1.market_num, b2.market_num) AS market_num FROM test.demo a -- 先关联table1,过滤并去重符合条件的数据 LEFT JOIN ( SELECT DISTINCT market_palce, market_num FROM test.table1 WHERE market_num >= 1 ) b1 ON a.source_country_palce = b1.market_palce -- 再关联table2,同样过滤去重 LEFT JOIN ( SELECT DISTINCT country_palce, market_num FROM test.table2 WHERE market_num >= 1 ) b2 ON a.source_country_palce = b2.country_palce;
方法2:UNION ALL + 优先级排序(适合多匹配场景)
如果同一个source_country_palce在table1/table2中有多条匹配数据,这种方法可以确保只取优先级最高的那一条:
WITH combined_data AS ( -- 从table1取数,标记优先级为1(最高) SELECT a.source_country_palce, b.market_num, 1 AS priority FROM test.demo a JOIN test.table1 b ON a.source_country_palce = b.market_palce WHERE b.market_num >= 1 UNION ALL -- 从table2取数,标记优先级为2 SELECT a.source_country_palce, b.market_num, 2 AS priority FROM test.demo a JOIN test.table2 b ON a.source_country_palce = b.country_palce WHERE b.market_num >= 1 ), ranked_data AS ( -- 按source_country_palce分组,按优先级排序取第一条 SELECT source_country_palce, market_num, ROW_NUMBER() OVER (PARTITION BY source_country_palce ORDER BY priority) AS rn FROM combined_data ) -- 只保留每组优先级最高的结果 SELECT DISTINCT source_country_palce, market_num FROM ranked_data WHERE rn = 1;
场景2:直接更新demo表的market_num字段
如果你的需求是把匹配到的结果直接写入demo表的market_num字段,可以用嵌套子查询结合COALESCE的UPDATE语句:
UPDATE test.demo a SET market_num = COALESCE( -- 先尝试从table1取匹配值 (SELECT DISTINCT market_num FROM test.table1 b WHERE a.source_country_palce = b.market_palce AND b.market_num >= 1), -- table1没匹配到的话,从table2取 (SELECT DISTINCT market_num FROM test.table2 b WHERE a.source_country_palce = b.country_palce AND b.market_num >= 1) );
以上几种方法都能满足你「优先table1, fallback到table2」的需求,你可以根据自己的实际数据情况选择最合适的方式~
内容的提问来源于stack exchange,提问作者Gowtham SB
相关产品推荐
相关产品推荐

