SQL如何按col1=col3、col2=col4规则优先取表B值覆盖表A?
该需求完全可以通过SQL实现。
核心实现逻辑如下:
- 由于SQL表本身是逻辑无序的,从你给出的示例来看两张表为行级一一对应,所以需要先给两张表生成行号作为关联键
- 使用SQL内置的
COALESCE函数即可实现「优先取B表非空值,空值则保留A表原值」的规则
示例代码(支持所有包含窗口函数的主流SQL引擎,如MySQL8.0+、PostgreSQL、Oracle、SQL Server等):
SELECT COALESCE(B.col3, A.col1) AS col1, COALESCE(B.col4, A.col2) AS col2 FROM ( -- 为表A生成行号 SELECT col1, col2, ROW_NUMBER() OVER() AS rn FROM 表A ) A LEFT JOIN ( -- 为表B生成行号 SELECT col3, col4, ROW_NUMBER() OVER() AS rn FROM 表B ) B ON A.rn = B.rn
运行上述代码得到的结果和你预期的Final_Table完全匹配:
- 第一行B表col3为NULL取A表col1的
a,B表col4非空取x,输出a、x - 第二行B表col3非空取
y,B表col4为NULL取A表col2的d,输出y、d - 第三行B表两个字段均为NULL,全取A表的
e、f
如果你的实际业务关联规则不是按行一一对应,仅需调整JOIN后的关联条件即可,取值逻辑仍然可以复用COALESCE函数。
内容的提问来源于stack exchange,提问作者Mehdi Selbi
相关产品推荐
相关产品推荐

