在我们系统中搜索一些旧的视图时。我遇到了一些值函数的用法,虽然我知道它在做什么,但我一生都无法理解为什么它会变得不必要的复杂。这是一个视图创建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 ...
我知道价值像COALESCE一样工作。SUBSTR将只保留VARCHAR(或NULL)。但是如果左连接没有结果,它将为null。
正如您所猜测的那样,这个视图是一个非常低效的SQL运行位,所有的连接
我是一名SAP开发人员,正在开发BODSETL,其中的数据将用于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
这两个联接中的值彼此不直接相关。只能间接通过其他连接结果。
2条答案
按热度按时间3duebb1j1#
很难说,在这个查询中什么是不必要的,因为你已经发布了一个模糊的版本...
但我认为复杂的max/值背后的原因是为数据组中最新的一行选择tablep.varcharfield(根据TABLEO.TIMESTAMPFIELD),如果所有行都存在,或者如果不是所有行都存在(NOT NULL),则为未来的最新行选择;但是如果一些不存在并且没有一个在将来存在,则至少使用简单的最大值表P.varcharfield。
r1zk6ea12#
如前所述,如果
TABLEO.TIMESTAMPFIELD
存在,此查询将使用TABLEO.TIMESTAMPFIELD
的值。如果左连接没有为TABLEO
生成任何匹配的行,那么第一个参数将为null,VALUE()
函数将使用第二个参数--今天的日期/时间。简而言之,这个表达式永远不会为空,因为在没有
TABLEO.TIMESTAMPFIELD
的情况下,它将默认为“now”。无论如何,这是一个地狱的加入。你需要确保你有适当的索引,使其合理的速度。