0

在我们系统中搜索一些旧视图时。我遇到了一些价值函数的使用,虽然我理解它在做什么,但我一生都无法弄清楚为什么它会变得不必要地复杂。这是来自视图创建 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 运行位,包含所有连接

我是一名从事 BODS ETL 的 SAP 开发人员,其中数据将用于 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

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

4

2 回答 2

0

如前所述,此查询将使用TABLEO.TIMESTAMPFIELDif present 的值。如果左连接没有产生任何匹配的行,TABLEO那么第一个参数将为空,VALUE()函数将使用第二个参数——今天的日期/时间。

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

无论如何,这是一个地狱般的加入。您需要确保拥有适当的索引以使其合理快速。

于 2019-03-01T15:12:04.230 回答
0

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

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

于 2019-03-02T12:27:39.817 回答