为什么在这里使用复杂的DB2“VALUE”函数?

8tntrjer  于 2023-06-22  发布在  DB2
关注(0)|答案(2)|浏览(171)

在我们系统中搜索一些旧的视图时。我遇到了一些值函数的用法,虽然我知道它在做什么,但我一生都无法理解为什么它会变得不必要的复杂。这是一个视图创建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

这两个联接中的值彼此不直接相关。只能间接通过其他连接结果。

3duebb1j

3duebb1j1#

很难说,在这个查询中什么是不必要的,因为你已经发布了一个模糊的版本...
但我认为复杂的max/值背后的原因是为数据组中最新的一行选择tablep.varcharfield(根据TABLEO.TIMESTAMPFIELD),如果所有行都存在,或者如果不是所有行都存在(NOT NULL),则为未来的最新行选择;但是如果一些不存在并且没有一个在将来存在,则至少使用简单的最大值表P.varcharfield。

r1zk6ea1

r1zk6ea12#

如前所述,如果TABLEO.TIMESTAMPFIELD存在,此查询将使用TABLEO.TIMESTAMPFIELD的值。如果左连接没有为TABLEO生成任何匹配的行,那么第一个参数将为null,VALUE()函数将使用第二个参数--今天的日期/时间。
简而言之,这个表达式永远不会为空,因为在没有TABLEO.TIMESTAMPFIELD的情况下,它将默认为“now”。
无论如何,这是一个地狱的加入。你需要确保你有适当的索引,使其合理的速度。

相关问题