掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系

在日常开发中,我们常常需要对复杂的 SQL 进行数据血缘分析。

本文重点讨论在具有 * 列的嵌套子查询中建立表和列之间正确关系的挑战。使用 Teradata SQL 代码示例来说明该过程。

本文聚焦于一个别名为 SUBSCRIBER_ 的子查询及其派生的列,这些列在外层查询中被使用。有些列在子查询的选择列表中被明确列出,而其他一些列则来自一个列(SUBSCR.),这个*列引用了 PRD2_ODW.SUBSCRIBER_ 表。

接着,分析检查了外层查询的选择列表,特别是来自 SUBSCRIBER_ 子查询的列。它展示了如何确定每一列的来源:

1、子查询中未显式列出的列(例如,SUBS_ID、ACTIVATION_DATE)源自 * 列,属于 PRD2_ODW.SUBSCRIBER_ 表。

2、子查询中显式列出的列(例如,FIRST_TP_ID、CUST_ID)可追溯到其原始表(在这些情况下为SUBS_CUST)。

此过程有助于将列准确映射到其源表,这对于理解复杂查询和维护具有星形列的嵌套子查询中的数据沿袭至关重要。

以下是演示中使用的 Teradata SQL 代码:

在这里插入图片描述
第130行: SUBSCRIBER_是子查询的别名,该子查询的派生列在外查询中使用。

SUBSCRIBER_ 的派生列从第 90 行开始到第 111 行,来自不同的表。还有一个以 SUBSCR 为前缀的星形列 *,它是 PRD2_ODW.SUBSCRIBER_ 表的别名。

现在,让我们看一下外部查询,特别是从第 23 行到第 87 行开始的选择列表部分,我们只关注子查询 SUBSCRIBER_ 中的列。
在这里插入图片描述

第23行:SUBSCRIBER_.SUBS_ID,第90行到第111行的选择列表中没有显式列出列SUBSCRIBER_ID,因此该列必须来自SUBSCR.*,而SUBSCR是第112行中PRD2_ODW.SUBSCRIBER_表的别名。

  • 结论:SUBS_ID 是表PRD2_ODW.SUBSCRIBER_ 的列

第 25 行: SUBSCRIBER_.REGISTRATION_DATE (NAMED REGISTRATION_DTTM),列 REGISTRATION_DATE 没有显式列在第 90 行到第 111 行的选择列表中,因此该列必须来自 SUBSCR.*,而 SUBSCR 是 PRD2_ODW.SUBSCRIBER_ 表的别名。

  • 结论:REGISTRATION_DATE 是表PRD2_ODW.SUBSCRIBER_的列

第26行: SUBSCRIBER_.FIRST_CALL(NAMED FIRST_CALL_DTTM),第90行到第111行的选择列表中没有明确列出列FIRST_CALL,因此该列必须来自SUBSCR.*,而SUBSCR是PRD2_ODW.SUBSCRIBER_表的别名。

  • 结论:FIRST_CALL是表PRD2_ODW.SUBSCRIBER_的列。

第 27 行: SUBSCRIBER_.FIRST_TP_ID,列 FIRST_TP_ID 在第 91 行的选择列表中显式列出:SUBS_CUST.FIRST_TP_ID。

  • 结论:FIRST_TP_ID是表SUBS_CUST的列

第 28 行: SUBSCRIBER_.CUST_ID,列 CUST_ID 在第 92 行的选择列表中显式列出:SUBS_CUST.CUST_ID。

  • 结论:CUST_ID 是表SUBS_CUST 的列

第 30 行: SUBSCRIBER_.DEALER_ID,列 DEALER_ID 在第 102 行的选择列表中显式列出:SUBS_CUST.DEALER_ID。

  • 结论:DEALER_ID 是表 SUBS_CUST 的列

第 35 行: SUBSCRIBER_.SRVP_COV_CUST_ID,列 SRVP_COV_CUST_ID 在第 93 行的选择列表中显式列出:SUBS_CUST.SRVP_COV_CUST_ID。

  • 结论:SRVP_COV_CUST_ID 是表 SUBS_CUST 的列

第 37 行:SUBSCRIBER_.TP_ID,列 TP_ID 在第 94 行的选择列表中显式列出:SUBS_CUST.TP_ID。

  • 结论:TP_ID是表SUBS_CUST的列

第 38 行: SUBSCRIBER_.BLOCK_QUOTA (NAMEDIS_BLOCK_QUOTA),列 BLOCK_QUOTA 在第 95 行的选择列表中显式列出:SUBS_CUST.BLOCK_QUOTA。

  • 结论:BLOCK_QUOTA是表SUBS_CUST的列

第 40 行: WHEN (SUBSCRIBER_.REL_CAT_ID < 0) THEN (NULL),列 REL_CAT_ID 在第 96 行的选择列表中显式列出:SUBS_CUST.REL_CAT_ID。

  • 结论:REL_CAT_ID 是表 SUBS_CUST 的列

第 47 行: SUBSCRIBER_.STATUS_CHNG_RSN_ID,列 STATUS_CHNG_RSN_ID 在第 97 行的选择列表中显式列出:SUBS_CUST.STATUS_CHNG_RSN_ID。

  • 结论:STATUS_CHNG_RSN_ID 是表 SUBS_CUST 的列

第 48 行: SUBSCRIBER_.STATUS_ID,列 STATUS_ID 在第 98 行的选择列表中显式列出:SUBS_CUST.STATUS_ID。

  • 结论:STATUS_ID 是表 SUBS_CUST 的列

第 49 行: SUBSCRIBER_.SUBS_TYPE_ID,列 SUBS_TYPE_ID 在第 99 行的选择列表中显式列出:SUBS_CUST.SUBS_TYPE_ID。

  • 结论:SUBS_TYPE_ID 是表 SUBS_CUST 的列

第 50 行: SUBSCRIBER_.BRANCH_ID (NAMED BRANCH_ID),列 BRANCH_ID 在第 100 行的选择列表中显式列出:SUBS_CUST.BRANCH_ID。

  • 结论:BRANCH_ID 是表 SUBS_CUST 的列

第 61 行: SUBSCRIBER_.BRANCH_ID (NAMED BRANCH_ID),列 BRANCH_ID 在第 100 行的选择列表中显式列出:SUBS_CUST.BRANCH_ID。

  • 结论:BRANCH_ID 是表 SUBS_CUST 的列

第 62 行: CAST((SUBSCRIBER_.CALC_PLATFORM_ID) AS DECIMAL(2, 0))(NAMED CALC_PLATFORM_ID),列 CALC_PLATFORM_ID 在第 110 行的选择列表中显式列出:END)(NAMED CALC_PLATFORM_ID),这是一个列别名,基础列是 SUBS_CUST.CALC_PLATFORM_ID。

  • 结论:CALC_PLATFORM_ID 是表 SUBS_CUST 的列

第 66 行: WHEN (((SUBSCRIBER_.BRANCH_ID = 61) AND (SUBSCRIBER_.CALC_PLATFORM_ID IN (6,7,8,9))) AND (:_spVV0 >= DATE ‘2018-04-30’)) THEN (0) ,列 BRANCH_ID 在第 100 行的选择列表中显式列出:SUBS_CUST.BRANCH_ID。

  • 结论:BRANCH_ID 是表 SUBS_CUST 的列。

第 71 行: CAST((SUBSCRIBER_.LAST_FLASH_DTTM) AS DATE)(NAMED LAST_FLASH_DTTM),列 LAST_FLASH_DTTM 在第 104 行的选择列表中显式列出:SUBS_CLR_FLASH.LAST_FLASH_DTTM。

  • 结论:LAST_FLASH_DTTM是表SUBS_CLR_FLASH的列。

第 73 行: WHEN (NOT (SUBSCRIBER_.FLASH_CODE_ID IS NULL)) THEN (SUBSCRIBER_.FLASH_CODE_ID),列 FLASH_CODE_ID 在第 105 行的选择列表中显式列出:SUBS_CLR_FLASH.FLASH_CODE_ID。

  • 结论:FLASH_CODE_ID是表SUBS_CLR_FLASH的列

第 77 行: WHEN (NOT (SUBSCRIBER_.IF_NEW_CHURN IS NULL)) THEN (SUBSCRIBER_.IF_NEW_CHURN),列 IF_NEW_CHURN 在第 106 行的选择列表中显式列出:SUBS_CLR_FLASH.IF_NEW_CHURN。

  • 结论: IF_NEW_CHURN 是表 SUBS_CLR_FLASH 的列

结论

表 PRD2_ODW.SUBSCRIBER_ 具有以下列:

PRD2_ODW.SUBSCRIBER_.SUBS_ID
PRD2_ODW.SUBSCRIBER_.ACTIVATION_DATE
PRD2_ODW.SUBSCRIBER_.REGISTRATION_DATE
PRD2_ODW.SUBSCRIBER_.FIRST_CALL

参考

数据血缘分析工具:SQLFlow

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/440183.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

融媒体服务中PBO进行多重采样抗锯齿(MSAA)

如果不理解pbo 那先去了解概念&#xff0c;在此不再解释&#xff0c;这是我为了做融合服务器viewpointserver做的一部分工作&#xff0c;融合服务器的功能是将三维和流媒体&#xff0c;AI融合在一起&#xff0c;viewpointserver会直接读取三维工程的文件&#xff0c;同时融合rt…

英语词汇小程序小程序|英语词汇小程序系统|基于java的四六级词汇小程序设计与实现(源码+数据库+文档)

英语词汇小程序 目录 基于java的四六级词汇小程序设计与实现 一、前言 二、系统功能设计 三、系统实现 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设布道师&a…

初始项目托管到gitee教程,开箱即用

0.本地仓库与远程仓库关联&#xff08;需先在gitee创建仓库&#xff09; ①打开powershell生成ssh key ssh-keygen -t ed25519 -C "Gitee SSH Key"-t key 类型-C 注释 生成成功如下&#xff0c;并按下三次回车 ②查看公私钥文件 ls ~/.ssh/输出&#xff1a; id_…

vulnhub-Web Developer 1靶机

vulnhub&#xff1a;Web Developer: 1 ~ VulnHub 导入靶机&#xff0c;放在kali同网段&#xff0c;扫描 靶机在192.168.114.129&#xff0c;扫描端口 有网站服务&#xff0c;访问 没什么东西&#xff0c;扫目录 真不少&#xff0c;访问一下&#xff0c;也只是一些普通的Wordpr…

【IEEE PDF eXpress】格式不对

目录 一、问题二、解决方法 一、问题 word的文档&#xff0c;用IEEE PDF eXpress网站生成pdf后&#xff0c;提交论文出现错误&#xff1a; Document validation failed due to the following errors: Content exceeds IEEE template margins for its format (Page 1:Bottom).…

我对软件工程的理解

1 引言 从事软件行业这么年&#xff0c;写了10年代码&#xff0c;又从事了多年的项目产品方面的工作&#xff0c;一些每天用到的软件工程的方法&#xff0c;虽然天天都在用但一些概念总感觉似是而非&#xff0c;正好借假期的时间&#xff0c;好好整理下&#xff0c;以供自己或…

【Golang】Go语言中时间time相关处理方法

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

认识动态规划算法和实践(java)

前言 动态规划算法里面最有意思的一个东西之一。动态规划初学肯定会有一定晦涩难懂。如果我们去网上搜索&#xff0c;动态规划的资料&#xff0c;它一开始都是将很多的理论&#xff0c;导致会认为很难&#xff0c;但是这个东西实际上是有套路的。 动态规划的英语是Dynamic Pr…

MySQL之分库分表后带来的“副作用”你是怎么解决的?

目录标题 一、垂直分表后带来的隐患二、水平分表后带来的问题1.多表联查问题2.增删改数据问题3.聚合操作问题 三、垂直分库后产生的问题1.跨库join问题2.分布式事务问题3.部分业务库依然存在的性能问题 四、水平分库后需要解决的问题1.聚合操作和连表问题2.数据分页问题3.ID主键…

10款好用的开源 HarmonyOS 工具库

大家好&#xff0c;我是 V 哥&#xff0c;今天给大家分享10款好用的 HarmonyOS的工具库&#xff0c;在开发鸿蒙应用时可以用下&#xff0c;好用的工具可以简化代码&#xff0c;让你写出优雅的应用来。废话不多说&#xff0c;马上开整。 1. efTool efTool是一个功能丰富且易用…

全球IP归属地查询-IP地址查询-IP城市查询-IP地址归属地-IP地址解析-IP位置查询-IP地址查询API接口

IP地址城市版查询接口 API是指能够根据IP地址查询其所在城市等地理位置信息的API接口。这类接口在网络安全、数据分析、广告投放等多个领域有广泛应用。以下是一些可用的IP地址城市版查询接口API及其简要介绍 1. 快证 IP归属地查询API 特点&#xff1a;支持IPv4 提供高精版、…

k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载

目录 1 MetailLB 搭建 1.1 MetalLB 的作用和原理 1.2 MetalLB功能 1.3 部署 MetalLB 1.3.1 创建deployment控制器和创建一个服务 1.3.2 下载MealLB清单文件 1.3.3 使用 docker 对镜像进行拉取 1.3.4 将镜像上传至私人仓库 1.3.5 将官方仓库地址修改为本地私人地址 1.3.6 运行清…

【前端】-音乐播放器(源代码和结构讲解,大家可以将自己喜欢的歌曲添加到数据当中,js实现页面动态显示音乐)

前言&#xff1a;音乐播放器是前端开发中的一个经典项目&#xff0c;通过它可以掌握很多核心技术&#xff0c;如音频处理、DOM操作、事件监听、动画效果等。这个项目不仅能提升前端开发的技能&#xff0c;还能让开发者深入理解JavaScript与HTML的协同作用。 页面展示&#xff1…

Web安全 - 文件上传漏洞(File Upload Vulnerability)

文章目录 OWASP 2023 TOP 10导图定义攻击场景1. 上传恶意脚本2. 目录遍历3. 覆盖现有文件4. 文件上传结合社会工程攻击 防御措施1. 文件类型验证2. 文件名限制3. 文件存储位置4. 文件权限设置5. 文件内容检测6. 访问控制7. 服务器配置 文件类型验证实现Hutool的FileTypeUtil使用…

Python中的机器学习:从入门到实战

机器学习是人工智能领域的一个重要分支&#xff0c;它通过构建模型来使计算机从数据中学习并做出预测或决策。Python凭借其丰富的库和强大的生态系统&#xff0c;成为了机器学习的首选语言。本文将从基础到实战&#xff0c;详细介绍如何使用Python进行机器学习&#xff0c;涵盖…

【汇编语言】寄存器(CPU工作原理)(二)—— 汇编指令的基础操作

文章目录 前言正文——&#xff08;一气呵成解决本文内容&#xff09;结语 前言 &#x1f4cc; 汇编语言是很多相关课程&#xff08;如数据结构、操作系统、微机原理&#xff09;的重要基础。但仅仅从课程的角度出发就太片面了&#xff0c;其实学习汇编语言可以深入理解计算机底…

Android Framework AMS(02)AMS启动及相关初始化5-8

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要涉及systemserver启动AMS及初始化AMS相关操作。同时由于该部分内容过多&#xff0c;因此拆成2个章节&#xff0c;本章节是第二章节&…

LabVIEW提高开发效率技巧----使用动态事件

在LabVIEW开发过程中&#xff0c;用户交互行为可能是多样且不可预知的。为应对这些变化&#xff0c;使用动态事件是一种有效的策略。本文将从多个角度详细介绍动态事件的概念及其在LabVIEW开发中的应用技巧&#xff0c;并结合实际案例&#xff0c;说明如何通过动态事件提高程序…

Vector不清晰点学习易错点

什么是迭代器 是一个广义指针它可以是指针&#xff0c;也可以是一个可对其执行类似指针得操作-如解除引用&#xff08;如operator*()&#xff09;和递增&#xff08;operator()&#xff09;STL中每个容器类都定义了一个合适的迭代器&#xff0c;该迭代器的类型是一个名为itera…

【Python游戏开发】贪吃蛇游戏demo拓展

拓展上一项目【Python游戏开发】贪吃蛇 实现穿墙效果 # 检测游戏是否结束 def check_gameover():global finished# 移除蛇头位置超过窗口判断for n in range(len(body) - 1):if(body[n].x snake_head.x and body[n].y snake_head.y):finished True # 状态检测 def ch…