sql - 为什么在这里使用复杂的 DB2 "VALUE" 函数?
问题描述
在我们系统中搜索一些旧视图时。我遇到了一些价值函数的使用,虽然我理解它在做什么,但我一生都无法弄清楚为什么它会变得不必要地复杂。这是来自视图创建 DDL。
SELECT
...
SUBSTR(
MAX(
CHAR(
VALUE(TABLEO.TIMESTAMPFIELD, TIMESTAMP(CURRENT_DATE, CURRENT_TIME))
)
||
TABLEP.VARCHARFIELD
),
27
)
...
FROM TABLEA
INNER JOIN TABLEB ON ...
INNER JOIN TABLEC ON ...
LEFT JOIN TABLED ON ...
LEFT JOIN TABLEE ON ...
LEFT JOIN TABLEF ON ...
LEFT JOIN TABLEG ON ...
LEFT JOIN TABLEH ON ...
LEFT JOIN TABLEI ON ...
LEFT JOIN TABLEJ ON ...
LEFT JOIN TABLEK ON ...
LEFT JOIN TABLEL ON ...
LEFT JOIN TABLEM ON ...
LEFT JOIN TABLEN ON ...
LEFT JOIN TABLEO ON ...
LEFT JOIN TABLEP ON ...
LEFT JOIN TABLEQ ON ...
WHERE .
GROUP BY ...
我知道 VALUE 像 COALESCE 一样工作。SUBSTR 将只留下 VARCHAR(或 NULL)。但是如果左连接没有结果,它无论如何都会为空。
正如你可以猜到的那样,这个视图是一个非常低效的 SQL 运行位,包含所有连接
我是一名从事 BODS ETL 的 SAP 开发人员,其中数据将用于 BOBJ WEBI 报告。我们的项目 DBA 还太年轻,无法理解其背后的原因。想想这里的某个地方可能有一些更聪明的头脑。
编辑:
LEFT JOIN TABLEO
ON TABLEO.ID_NOTE = TABLEN.ID_NOTE
AND TABLEO.ID_CASE = TABLEC.ID_CASE
AND TABLEO.ID_PRSN = TABLEA.ID_PRSN
AND TABLEO.CD_FTOF_CNTC = 'C'
LEFT JOIN TABLEP
ON TABLEP.ID_WORKER_ROLE = TABLEN.ID_CR
这两个连接中的值不直接相互关联。只能间接通过其他连接结果。
解决方案
如前所述,此查询将使用TABLEO.TIMESTAMPFIELD
if present 的值。如果左连接没有产生任何匹配的行,TABLEO
那么第一个参数将为空,VALUE()
函数将使用第二个参数——今天的日期/时间。
简而言之,这个表达式永远不会为空,因为如果没有TABLEO.TIMESTAMPFIELD
它,它将默认为“现在”。
无论如何,这是一个地狱般的加入。您需要确保拥有适当的索引以使其合理快速。
推荐阅读
- nsis - 如何在使用 NSIS 从许可协议安装程序屏幕中单击“打印”时显示打印对话框以选择打印选项
- django - 有没有什么想法可以在 django 表单处理中将结束标记(/>)放在 html 的文本输入标记中?
- dart - 如何在 Flutter 中使用 Bloc 正确设置 DropdownButton 的值?
- swift - SpriteKit Particle Emitter - 粒子在创建后是否会受到力的影响
- python - 满足条件时列表中的值总和
- java - 我无法在 Android 8 Oreo(华为)中选择 PDF 文件
- hyperledger-fabric - Hyperledger Fabric - Orderer 日志在广播期间显示错误,即使交易成功并提交给所有对等方
- c++ - Vulkan 中的 YCbCr 采样器
- javascript - angular 6中带有http调用的custome管道不返回值
- vba - 如何从当前选择开始在文档中查找单词