复杂的DB2“VALUE”函数 - 为什么要使用它?

问题描述 投票:0回答:2

在我们的系统中搜索一些旧视图时。我遇到了一些价值功能使用,虽然我明白它在做什么我不能为我的生活想象为什么它会变得不必要的复杂。这是来自View创建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)。但是如果左连接没有结果,那么无论如何它都是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

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

sql db2 database-administration
2个回答
0
投票

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

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

在任何情况下,这是一个地狱的加入。您需要确保拥有适当的索引以使其快速合理。


0
投票

很难说,这个查询中没有必要,因为你发布了一个混淆版本......

但我认为复杂max / value背后的原因是为数据组中的最新一行(根据TABLEO.TIMESTAMPFIELD)选择tablep.varcharfield,如果它们都存在,或者如果不是全部存在(NOT) NULL),然后是最新的谎言;但是如果有些不存在而且未来没有一个,那么至少使用简单的最大tablep.varcharfield。

© www.soinside.com 2019 - 2024. All rights reserved.