这里为什么要用复杂的DB2 "VALUE"函数?

Why complex DB2 "VALUE" Function is used here?

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

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

如前所述,此查询将使用 TABLEO.TIMESTAMPFIELD 的值(如果存在)。如果左连接没有为 TABLEO 生成任何匹配行,那么第一个参数将为 null,而 VALUE() 函数将使用第二个参数——今天的 date/time。

简而言之,这个表达式永远不会为空,因为在没有 TABLEO.TIMESTAMPFIELD 的情况下它将默认为 "now"。

在任何情况下,这都是一个非常棒的连接。您需要确保拥有适当的索引以使其合理快速。

很难说,这个查询中什么是不必要的,因为你发布了一个混淆版本...

但我认为复杂 max/value 背后的原因是 select 即 tablep.varcharfield 对于数据组中的最新行(根据 TABLEO.TIMESTAMPFIELD),如果所有这些都存在,或者如果不是所有存在(NOT NULL),那么对于未来最新的谎言;但是如果一些不存在并且将来没有一个存在,那么至少使用简单的最大值 tablep.varcharfield。