如何在Teradata SQL中按分组补全缺失产品的行数据
需求
获取每个ID对应的完整产品列表:
- 包含Table1中该ID已关联的所有产品
- 包含Table2中所有未在该ID的Table1记录里出现过的产品
- 对于Table1中无匹配的产品,产品名称保留原名称(或标记为
missing/null,若需统一标记可调整),并关联至目标ID
现有表结构
Table1
| PROD NAME | ID | C |
|---|---|---|
| PRD1 | A1. | 1 |
| PRD2. | A1. | 3 |
| PRD3. | A2. | 22 |
| PRD1. | A3 | 23 |
Table2
| PROD NAME | D. | E |
|---|---|---|
| PRD1 | 11 | 2 |
| PRD4. | 4. | 4 |
| PRD3. | 3. | 4 |
示例输出(ID = A1时)
| PROD NAME | ID | C. | D. | E |
|---|---|---|---|---|
| PRD1. | A1. | 1. | 11. | 2 |
| PRD2. | A1. | 3. | ? | ? |
| PRD3. | A1. | ? | 3. | 4 |
| PRD4. | A1. | ? | 4. | 4 |
解决方案
要实现这个需求,关键是先构建所有产品的全集和所有ID的集合,通过笛卡尔积生成每个ID与所有产品的组合,再用左连接关联两张表的字段,缺失值会自动返回NULL(对应示例中的?)。
SQL实现(以MySQL为例)
-- 生成所有ID与所有产品的组合,再关联表数据 SELECT ap.`PROD NAME`, ai.ID, t1.C AS `C.`, t2.`D.`, t2.E FROM (SELECT DISTINCT ID FROM Table1) ai -- 笛卡尔积:每个ID匹配所有产品 CROSS JOIN ( -- 合并两张表的产品,去重得到全集 SELECT `PROD NAME` FROM Table1 UNION SELECT `PROD NAME` FROM Table2 ) ap -- 左连接Table1,保留所有ID-产品组合 LEFT JOIN Table1 t1 ON ai.ID = t1.ID AND ap.`PROD NAME` = t1.`PROD NAME` -- 左连接Table2,关联产品对应的D、E字段 LEFT JOIN Table2 t2 ON ap.`PROD NAME` = t2.`PROD NAME` -- 筛选特定ID,比如A1 WHERE ai.ID = 'A1.';
补充说明
- 如果需要将Table1中无匹配的产品名称统一标记为
missing,可以把ap.PROD NAME替换为`CASE WHEN t1.ID IS NULL THEN 'missing' ELSE ap.`PROD NAME` END AS `PROD NAME - 若数据库支持CTE(如PostgreSQL、SQL Server),可以用更清晰的写法:
WITH all_products AS ( SELECT `PROD NAME` FROM Table1 UNION SELECT `PROD NAME` FROM Table2 ), all_ids AS ( SELECT DISTINCT ID FROM Table1 ) SELECT ap.`PROD NAME`, ai.ID, t1.C AS `C.`, t2.`D.`, t2.E FROM all_ids ai CROSS JOIN all_products ap LEFT JOIN Table1 t1 ON ai.ID = t1.ID AND ap.`PROD NAME` = t1.`PROD NAME` LEFT JOIN Table2 t2 ON ap.`PROD NAME` = t2.`PROD NAME` WHERE ai.ID = 'A1.';
内容的提问来源于stack exchange,提问作者GMS
相关产品推荐
相关产品推荐

