【发布时间】:2017-07-03 13:28:00
【问题描述】:
我的办公室有一台几乎没人知道的旧 AS400,还有一些与之交互的旧程序。在查看一些程序时,我发现了一个包含引起我注意的查询的文件。我在使用 Oracle 数据库时擅长 SQL(我在数据仓库工作了几年,每天 8 小时查询 Oracle),但我没有使用 DB2(或 RPG/SQLRPGLE,我认为这是基于我的搜索),这个查询对我来说似乎完全陌生。以下是查询(出于数据安全/匿名的目的略有改动):
SELECT
WDATA(CVTDATE(PRDADT,CYMD)) NAME(@PRDADT) COLHDG("Availability Date"),
WDATA(prdid.1) NAME(product) COLHDG("Product ID"),
prdsku.1 EDTCDE(4),
prcxif.2,
sum(prcval) NAME(@price) LEN(6,2)
FROM
mydb/prod T01,
mydb/pric,
mydb/vndr T02,
PARTIAL OUTER JOIN
prdid.1=prcid.2
and prdsku.1=prcsku.2
and prdid.1=vnid.3
WHERE
prdcbp=&CBP
and prdadt BETWEEN yymmdd(date("&&startdt")) AND yymmdd(date("&&enddt"))
GROUP BY
prdsku.1,
prcxif.2
ORDER BY
prdsku
我无法理解这里的一些内容。我已经收集到表名中的斜杠是separate schema/table 的 DB2 特定方式,cvtdate 表示我们使用名为 Sequel Data Access 的程序/实用程序,EDTCDE 似乎是format output values 的一种方式,但在几个小时后的研究我仍然找不到一些问题的答案(主要是因为谷歌在大多数搜索中不解释符号):
- 求和字段后的 LEN(6,2) 是什么?我认为它会进行某种填充/舍入(如最大长度或 6 位的零填充长度,带两位小数),但每当我搜索“len”时,Google 都会给我包含“长度”的结果,或者我发现查询似乎使用只有一个参数的函数来获取字符串的长度。
- 某些列名上的“.#”后缀是什么?它没有在 ORDER BY 中使用,因此看起来它实际上并不在字段名称中;它看起来更像是引用该列所属的 FROM 列表中的哪个表。但是,当使用另一个 DB2 数据库时,我不必为连接的表做任何类似的事情,我只需在它们前面加上 Oracle 之类的表名......而且每个列名似乎都使用一个特定于表的前缀,所以不知道为什么要识别表。
- 什么是 &[text] 和 &&[text] 对象?我认为 &CBP 代表一个传递的参数,但我不知道为什么它有一个 & 符号而 &&startdt 和 &&enddt 有两个;也许是一种转义字符,因为它们是用引号引起来的?
- WDATA 做什么?第二个 WDATA 行似乎在稍后使用之前将格式应用于列(在条件中),但第一行似乎将名称/标题应用于稍后未返回或使用的列。
我相信这里的一些聪明人会看到这个查询并立即知道它的含义,但我完全不知道它是如何工作的,所以如果有任何见解的人可以分享,我会很高兴它。
谢谢!
【问题讨论】:
标签: sql db2 ibm-midrange