在我们的系统中搜索一些较旧的视图时。我遇到了一些价值函数的使用,虽然我了解它在做什么,但我一生都无法弄清楚为什么它会变得不必要地复杂。这是来自视图创建 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的运行效率非常低的位
我是一名SAP开发人员,致力于BODS ETL,其中数据将用于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
这两个联接中的值彼此没有直接关系。仅间接通过其他联接结果。
很难说,这个查询中有什么不必要的,因为你已经发布了一个混淆的版本......
但我认为复杂的最大值/值背后的原因是为数据组中的最新一行选择 tablep.varcharfield(根据 TABLEO。时间戳字段),如果它们都存在,或者如果不是全部存在(不是 NULL),那么对于将来最新的谎言;但是,如果有些不存在并且将来没有一个,那么至少使用简单的最大 tablep.varcharfield。
如前所述,此查询将使用TABLEO.TIMESTAMPFIELD
的值(如果存在)。如果左连接没有为TABLEO
生成任何匹配的行,则第一个参数将为 null,VALUE()
函数将使用第二个参数 - 今天的日期/时间。
简而言之,此表达式永远不会为空,因为如果没有TABLEO.TIMESTAMPFIELD
它将默认为"now"。
无论如何,这是一个地狱般的连接。您需要确保具有适当的索引以使其合理快速。