Использование max-функции в подзапросе, относящемся к основному запросу - PullRequest
1 голос
/ 24 октября 2019

У меня следующая проблема: у меня есть две таблицы TAB_1 и TAB_2.

В TAB_1 Я хотел бы заполнить столбец FEAT_A1 соответствующим значением в TAB_2. Следовательно, я объединяю обе таблицы по их общей особенности FEAT_B.

К сожалению, для FEAT_B2 -ID в TAB_2 существует несколько записей. Я хотел бы использовать соответствующую запись, для которой FEAT_D2 является максимальным.

Я могу выполнить эту операцию с кодом, показанным ниже. К сожалению, код очень медленный, так как в каждом совпадении мне приходится выполнять один заказ и одну операцию извлечения.

Можете ли вы придумать более эффективный способ программирования?

Комууточнить, вот пример TAB_2 записей:

FEAT_A2     FEAT_B2    FEAT_C2         FEAT_D2
"A"           42      "SOMETHING"        7
"B"           42      "SOMETHING"        11
"D"           42      "SOMETHING"        1
"A"           42      "SOMETHING"        3

в TAB_1, для FEAT_B1 = 42, я хотел бы установить FEAT_A1 = "B".

UPDATE TAB_1
SET TAB_1.FEAT_A1 = (
    SELECT FEAT_A2 FROM TAB_2
    WHERE TAB1.FEAT_B1 = TAB2.FEAT_B2
        AND TAB2.FEAT_C2 = 'SOMETHING'
    ORDER BY TAB2.FEAT_D2 DESC
    FETCH FIRST 1 ROW ONLY);

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Я бы предложил использовать для этого merge.

MERGE INTO TAB_1 T1
USING (SELECT FEAT_A2, FEAT_B2,
              ROW_NUMBER() OVER (PARTITION BY FEAT_B2 
                                 ORDER BY FEAT_D2 DESC NULLS LAST) AS RN
         FROM TAB_2) T2
ON (T1.FEAT_B1 = T2.FEAT_B2 AND T2.RN = 1)
WHEN MATCHED THEN 
UPDATE SET T1.FEAT_A1 = T2.FEAT_A2

Ура !!

0 голосов
/ 24 октября 2019

Для этого запроса:

UPDATE TAB_1
    SET TAB_1.FEAT_A1 =
        (SELECT FEAT_A2
         FROM TAB_2
         WHERE TAB1.FEAT_B1 = TAB2.FEAT_B2 AND
               TAB2.FEAT_C2 = 'SOMETHING'
         ORDER BY TAB2.FEAT_D2 DESC
         FETCH FIRST 1 ROW ONLY
        );

Требуется индекс для tab_2(FEAT_B1, FEAT_C2, FEAT_D2 DESC). Это должно стать заметным улучшением производительности.

Тем не менее, вы собираетесь обновить все строки в TAB_1. Если эта таблица не маленькая, то для выполнения обновлений будет много накладных расходов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...