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

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

在我们系统中搜索一些旧的视图时。我遇到了一些value函数的使用,虽然我明白它是做什么的,但我不能为我的生活想明白,为什么它会变得不必要的复杂。这是来自于一个创建视图的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的工作原理和coalce一样。SUBSTR只会留下VARCHAR(或NULL)。但如果左联接没有结果,无论如何都会是null。

正如你所猜测的那样,这个视图是一个非常低效的SQL运行位与所有的连接

我是一个SAP开发人员,正在做一个BODS ETL,数据会用在BOBJ WEBI报表中。我们的项目DBA有点太年轻了,也不明白其中的道理。估计这里的某个地方有聪明人,可能会有一些见解。

EDIT。

   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

这两个join中的值之间没有直接关系。只不过是通过其他的联接结果间接地联系在一起。

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

正如所介绍的,这个查询将使用的值 TABLEO.TIMESTAMPFIELD 如果存在的话。如果左连接没有产生任何与 TABLEO 那么第一个参数将是空的,而 VALUE() 函数将使用第二个参数--今天的日期时间。

简而言之,这个表达式永远不会是空的,因为如果没有使用 TABLEO.TIMESTAMPFIELD 它将默认为 "现在"。

在任何情况下,这是一个地狱般的连接。你需要确保你有适当的索引,使其合理快速。


0
投票

很难说,在这个查询中哪些是不必要的,因为你已经发布了一个混淆的版本......

但我认为复杂的maxvalue背后的原因是为了选择该tablep.varcharfield为数据组中最新的一条记录(根据TABLEO.TIMESTAMPFIELD),如果所有的都存在,或者如果不是所有的都存在(NOT NULL),那么为最新的躺在未来;但如果有些不存在,没有一条躺在未来,那么至少使用简单的最大tablep.varcharfield。

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