请求修正基于视图整合new_table与old_table WDR数据的SQL代码
问题场景
现有两张表数据:
- new_table数据:
| Code | name |
|---|---|
| S001 | WDR |
| S002 | WDR |
| S005 | AXC |
- old_table数据:
| Code | name |
|---|---|
| S001 | WDR |
| S003 | WDR |
| S004 | MNO |
约束:不可修改两张原始表,需创建视图Dummy实现数据整合,要求:
- 包含new_table中所有name为WDR的数据
- 包含old_table中未与new_table的WDR数据重复的所有数据(重复指Code相同,以new_table数据为准)
- 最终视图输出
code、name、db_name字段,示例输出:
| code | name | db_name |
|---|---|---|
| S001 | WDR | New |
| S002 | WDR | New |
| S003 | WDR | old |
| S004 | MNO | old |
原SQL存在的问题
- 多个字段定义之间缺失逗号(如
name = ne.name与db_name = CAST('New' as char(3))之间无逗号) old_table的查询未过滤掉与new_table中WDR重复的Code,导致重复Code的优先级处理错误Row_Number的排序规则错误,order by db_name DESC会让old优先级高于New,不符合"重复Code以new_table数据为准"的要求- 存在不必要的
Distinct,Union All结合后续Row_Number已能实现去重逻辑
修正后的SQL代码
CREATE VIEW Dummy AS WITH input AS ( -- 取new_table中所有name为WDR的数据,标记为New SELECT Code = ne.Code, name = ne.name, db_name = CAST('New' AS CHAR(3)) FROM new_table AS ne WHERE name = 'WDR' UNION ALL -- 取old_table中Code不在new_table的WDR集合中的所有数据,标记为old SELECT Code = ol.Code, name = ol.name, db_name = CAST('old' AS CHAR(3)) FROM old_table AS ol WHERE ol.Code NOT IN ( SELECT Code FROM new_table WHERE name = 'WDR' ) ), data AS ( SELECT code = input.code, name = input.name, db_name = input.db_name, -- 按Code分组,让New的优先级最高(ranking=1) ranking = ROW_NUMBER() OVER(PARTITION BY code ORDER BY db_name ASC) FROM input ) SELECT code = data.code, name = data.name, db_name = data.db_name FROM data WHERE data.ranking = 1;
修正说明
- 补全字段间缺失的逗号,修复语法错误
- 为old_table添加过滤条件,通过子查询排除new_table中WDR的Code,避免重复数据进入临时集合
- 将
ROW_NUMBER排序规则改为ORDER BY db_name ASC,利用字母顺序让New记录被标记为ranking=1,确保重复Code以new_table数据为准 - 移除不必要的
Distinct,将模糊查询like '%WDR%'改为精确匹配name = 'WDR',贴合需求明确性 - 在data临时表中保留db_name字段,确保最终查询能正确输出该字段
内容的提问来源于stack exchange,提问作者Mohit
相关产品推荐
相关产品推荐

