You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Teradata SQL中按分组补全缺失产品的行数据

需求

获取每个ID对应的完整产品列表:

  • 包含Table1中该ID已关联的所有产品
  • 包含Table2中所有未在该ID的Table1记录里出现过的产品
  • 对于Table1中无匹配的产品,产品名称保留原名称(或标记为missing/null,若需统一标记可调整),并关联至目标ID
现有表结构

Table1

PROD NAMEIDC
PRD1A1.1
PRD2.A1.3
PRD3.A2.22
PRD1.A323

Table2

PROD NAMED.E
PRD1112
PRD4.4.4
PRD3.3.4
示例输出(ID = A1时)
PROD NAMEIDC.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:13:09