如何用SQL实现两表关联,将table1未出现的seq_number映射至tp_no=0?
正确SQL实现方案
问题分析
你原SQL的核心问题:
- 用
INNER JOIN会过滤掉不匹配的记录,没法保留table_1里需要的所有目标sequence_number - 关联条件
tar.tp_no <> brd.sequence_number逻辑错误,应该判断table_1的sequence_number在同c_Id的table_2中没有对应的tp_no - 仅筛选
tar.tp_no = '0'但关联逻辑不对,导致结果完全不符合预期
实现思路
- 先从table_1里挑出对应c_Id下,没在table_2的tp_no中出现过的sequence_number
- 把这些记录和table_2里
tp_no = '0'的同c_Id记录关联 - 用
CREATE TABLE或CREATE VIEW把结果存成可复用的表
正确SQL语句
方法1:创建物理持久化表
如果需要固定数据,不随原表更新变化,用这个:
CREATE TABLE merged_result AS SELECT t1.c_Id, t1.Toucpoint, t1.sequence_number, t2.tot_Id, t2.tp_no FROM table_1 t1 JOIN table_2 t2 ON t1.c_Id = t2.c_Id AND t2.tp_no = '0' WHERE NOT EXISTS ( SELECT 1 FROM table_2 t2_sub WHERE t2_sub.c_Id = t1.c_Id AND t2_sub.tp_no = t1.sequence_number );
方法2:创建实时视图
如果需要结果随原表数据自动同步,建议创建视图:
CREATE VIEW merged_result_view AS SELECT t1.c_Id, t1.Toucpoint, t1.sequence_number, t2.tot_Id, t2.tp_no FROM table_1 t1 JOIN table_2 t2 ON t1.c_Id = t2.c_Id AND t2.tp_no = '0' WHERE NOT EXISTS ( SELECT 1 FROM table_2 t2_sub WHERE t2_sub.c_Id = t1.c_Id AND t2_sub.tp_no = t1.sequence_number );
语句说明
NOT EXISTS子句:精准筛选table_1中,同c_Id下未在table_2的tp_no里出现过的sequence_number,这正是你要的核心数据- 关联table_2时直接指定
t2.tp_no = '0',一步匹配到需要映射的目标记录 - 物理表是独立存储数据,查询更快但不会同步原表变更;视图是虚拟表,每次查询都从原表取数,适合需要实时同步的场景
内容的提问来源于stack exchange,提问作者rns
相关产品推荐
相关产品推荐

