创建通过复制补全缺失FK条目的SQL视图技术需求
解决方案:创建SQL视图补全缺失的NR-FK条目
这个需求我之前碰见过类似的,核心思路是先构建出所有应该存在的NR与FK的组合,再关联原表补全对应的Description。毕竟题目里明确说了每个NR至少有一行FK=0的记录,这刚好能帮我们拿到每个NR对应的默认描述。
具体SQL代码
CREATE VIEW complete_nr_fk_view AS -- 第一步:获取所有存在的FK值(要补全的目标FK集合) WITH all_fks AS ( SELECT DISTINCT FK FROM your_original_table ), -- 第二步:获取每个NR对应的默认描述(利用每个NR都有FK=0的记录) nr_default_descriptions AS ( SELECT NR, Description FROM your_original_table WHERE FK = 0 ) -- 第三步:生成所有NR-FK组合,左连原表补全数据 SELECT nd.NR, -- 如果原表有对应条目就用原描述,没有就用NR的默认描述 COALESCE(t.Description, nd.Description) AS Description, af.FK FROM nr_default_descriptions nd -- 笛卡尔积得到所有可能的NR-FK组合 CROSS JOIN all_fks af -- 左连接原表匹配已有数据 LEFT JOIN your_original_table t ON nd.NR = t.NR AND af.FK = t.FK -- 按NR和FK排序,和示例输出一致 ORDER BY nd.NR, af.FK;
代码解释
all_fksCTE:提取原表中所有不重复的FK值,比如你的示例里就是0,1,2,这是我们要为每个NR补全的FK范围。nr_default_descriptionsCTE:因为每个NR都有FK=0的记录,所以直接取这些行的NR和Description,就能得到每个NR对应的默认描述(比如示例里NR=1对应的就是Text3)。- 笛卡尔积+左连接:把每个NR和所有FK值做组合,再左连接原表。如果原表已经有该NR-FK的条目,就用原表的Description;如果没有(也就是缺失的条目),就用NR的默认Description补全,完美实现你要的效果。
验证示例结果
用你给出的原表数据运行这个视图,就能得到:
| NR | Description | FK |
|---|---|---|
| 0 | Text1 | 0 |
| 0 | Text2 | 1 |
| 0 | Text4 | 2 |
| 1 | Text3 | 0 |
| 1 | Text3 | 1 |
| 1 | Text3 | 2 |
完全符合你的期望输出~
内容的提问来源于stack exchange,提问作者Vilius
相关产品推荐
相关产品推荐

