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

时间:2019-03-01 14:55:49

标签: sql db2 database-administration

在系统中搜索某些较旧的视图时。我遇到了一些值函数用法,虽然我了解它在做什么,但我无法终生弄清楚为什么它会变得不必要地复杂。这来自于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

这两个联接中的值并不直接相互关联。仅间接通过其他联接结果。

2 个答案:

答案 0 :(得分:0)

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

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

在任何情况下,这都是令人难忘的。您需要确保拥有适当的索引以使其变得合理快速。

答案 1 :(得分:0)

很难告诉您,此查询中什么是不必要的,因为您已发布了一个混淆的版本...

但是我认为复杂的最大值/值背后的原因是,如果存在所有表项,或者不是全部存在,则为数据组中最新的一行选择tablep.varcharfield(根据TABLEO.TIMESTAMPFIELD)。现在(NOT NULL),然后是将来的最新情况;但是如果不存在某些表,并且将来没有一个表,那么至少使用简单的最大表p.varcharfield。