Сложная функция DB2 VALUE - зачем это нужно использовать? - PullRequest
0 голосов
/ 01 марта 2019

При поиске через некоторые старые представления в нашей системе.Я натолкнулся на какое-то использование ценностной функции, которое, хотя я понимаю, что оно делает, не может понять, почему это было бы слишком сложным.Это из представления создания 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, работающий над ETL BODS, где данные будут использоваться в BOBJ WEBIотчет.Администраторы нашего проекта слишком молоды, чтобы понять причину этого.Подумайте, есть где-то более яркие умы, которые могут иметь некоторое понимание

РЕДАКТИРОВАТЬ:

   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 голосов
/ 02 марта 2019

Трудно сказать, что не нужно в этом запросе, так как вы опубликовали запутанную версию ...

Но я думаю, что причина сложного max / value состоит в том, чтобы выбрать это tablep.varcharfield дляодна самая новая строка в группе данных (в соответствии с TABLEO.TIMESTAMPFIELD), если все они присутствуют или если не все присутствуют (NOT NULL), то для самой новой лжи в будущем;но если некоторые из них не присутствуют, и ни один из них не появится в будущем, то используется хотя бы простой максимум tablep.varcharfield.

0 голосов
/ 01 марта 2019

Как представлено, этот запрос будет использовать значение TABLEO.TIMESTAMPFIELD, если оно присутствует.Если при левом соединении не будет найдено ни одной подходящей строки для TABLEO, то первый параметр будет нулевым, а функция VALUE() будет использовать второй параметр - дату / время сегодняшнего дня.

Корочеэто выражение никогда не будет нулевым, поскольку при отсутствии TABLEO.TIMESTAMPFIELD оно по умолчанию будет «сейчас».

В любом случае это адское соединение.Вы должны убедиться, что у вас есть соответствующие индексы, чтобы сделать его достаточно быстрым.

...