Избегайте множественного SELECT при обновлении столбца таблицы относительно столбца другой таблицы - PullRequest
0 голосов
/ 30 ноября 2018

Я новичок в SQL-запросах, но мне нужно изменить столбец таблицы относительно столбца другой таблицы.На данный момент у меня работает следующий запрос:

UPDATE table1
SET date1=(
    SELECT last_day(max(date2))+1
    FROM table2
    WHERE id=123
    )
WHERE id=123
  AND date1=to_date('31/12/9999', 'dd/mm/yyyy');

Проблема с этой структурой заключается в том, что, я полагаю, запрос SELECT будет выполняться для каждой строки table1.Поэтому я попытался создать еще один запрос, но у него есть синтаксическая ошибка где-то после ключевого слова FROM:

UPDATE t1
SET t1.date1=last_day(max(t2.date2))+1
FROM table1 t1
INNER JOIN table2 t2
        ON t1.id=t2.id
WHERE t1.id=123
  AND t1.date1=to_date('31/12/9999', 'dd/mm/yyyy');

И, кроме того, я даже не знаю, быстрее ли он, чем первый...

У вас есть идеи, как я могу решить эту проблему?

Большое спасибо!

С уважением,

Жюльен

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Пожалуйста, попробуйте использовать MERGE

MERGE INTO ( 
    SELECT id, 
           date1 
      FROM table1 
     WHERE date1 = to_date('31/12/9999', 'dd/mm/yyyy')
       AND id = 123
) t1
USING (
    SELECT id,
           last_day(max(date2))+1 max_date
    FROM table2
    WHERE id=123
    GROUP BY id
) t2 ON (t1.id = t2.id)
WHEN MATCHED THEN
  UPDATE SET t1.date1 = t2.max_date
;
0 голосов
/ 30 ноября 2018

Первый код, который вы написали, в порядке.Это не будет выполняться для каждой строки table1, как вы боитесь.Он выполнит следующее:

  • запустит подзапрос, чтобы найти значение, которое вы хотите использовать в вашем операторе UPDATE, выполнив поиск по table2, но, как вы указали, точно id из таблицы это должно быть как можно быстрее, если вы создали индекс для этого (я полагаю, первичного ключа) столбца
  • он будет выполнять внешний запрос, находя нужную вам строкуобновлять.Как и прежде, это должно быть как можно быстрее, если вы указали точное значение id, если в этом столбце есть индекс

Подводя итог, если эти идентификаторы уникальны, оба вашихПодзапрос и ваш запрос должны возвращать только одну строку, и он должен выполняться максимально быстро.Если вы считаете, что выполнение не достаточно быстрое (по крайней мере, это занимает больше времени, чем оправдывает объем данных), проверьте, имеют ли эти столбцы уникальные значения и имеют ли они уникальные индексы.

Фактически, этобыло бы лучше добавить эти индексы независимо от этой проблемы, если они не существуют и если эти столбцы имеют уникальные значения, поскольку это значительно улучшило бы все характеристики этих таблиц, которые выполняют поиск в этих столбцах идентификаторов.

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