如何在Teradata SQL中基于两张现有表创建含二进制标识值的新表
Teradata SQL 实现多表存在性标记表的方案
核心思路
通过全量合并两张表的所有ID,再分别判断ID在各源表的存在性生成对应标记列,两种常用实现方式如下:
方案1:全外连接实现(推荐,2表场景性能最优)
CREATE TABLE new_table AS ( SELECT COALESCE(t1.ID, t2.ID) AS ID, CASE WHEN t1.ID IS NOT NULL THEN 1 ELSE 0 END AS tab1, CASE WHEN t2.ID IS NOT NULL THEN 1 ELSE 0 END AS tab2 FROM Table1 t1 FULL OUTER JOIN Table2 t2 ON t1.ID = t2.ID ) WITH DATA PRIMARY INDEX (ID);
说明:
FULL OUTER JOIN会保留两张表的所有ID记录,不会丢失任何一方的IDCOALESCE函数自动取两个表中存在的ID值,避免出现空ID- Teradata建表必须指定主索引,
PRIMARY INDEX (ID)可根据你的实际数据分布规则调整
方案2:UNION ALL + 聚合实现(适合多表扩展场景)
如果后续需要扩展到3张及以上表打标记,这个方案可直接套用,改动成本极低:
CREATE TABLE new_table AS ( SELECT ID, MAX(tab1) AS tab1, MAX(tab2) AS tab2 FROM ( -- 遍历Table1的ID,标记tab1为1 SELECT ID, 1 AS tab1, 0 AS tab2 FROM Table1 UNION ALL -- 遍历Table2的ID,标记tab2为1 SELECT ID, 0 AS tab1, 1 AS tab2 FROM Table2 ) all_id GROUP BY ID ) WITH DATA PRIMARY INDEX (ID);
测试结果验证
按照你给出的样例数据,最终生成的new_table内容如下:
| ID | tab1 | tab2 |
|---|---|---|
| 10 | 1 | 1 |
| 11 | 1 | 0 |
| 12 | 1 | 0 |
| 13 | 0 | 1 |
| 14 | 0 | 1 |
| 15 | 0 | 1 |
完全匹配需求。
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

