Пакетное обновление SQL с присоединением к временной таблице

У меня проблемы с эффективным обновлением.

Позвольте мне изложить свои проблемы. Таблица people:

CAIDсозданныймодифицированный
11-1-20011-1-2005
21-1-20011-1-2005
31-1-20011-1-2005
41-1-20011-1-2005
51-1-20011-1-2005

У меня есть таблица, подобная приведенной выше (с большим количеством столбцов), длиной в несколько миллионов строк. Мне нужно обновить около полумиллиона измененных дат, чтобы они соответствовали созданным датам.

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

DECLARE @temp TABLE(
    id BIGINT NOT NULL IDENTITY(1,1) PRIMARY KEY,
    caID BIGINT
)
INSERT INTO @temp
(
    caID
)

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

Здесь все идет не так. Я видел много примеров на этом веб-сайте пакетных обновлений, но моя проблема в том, что я хочу использовать таблицу temp / var во INNER JOIN для обновления основной таблицы.

UPDATE p
SET p.Modified = p.Created
FROM people p
JOIN @temp t ON t.caID = p.caID

Я очень смущен тем, как я буду обновлять это пакетно, поэтому любые советы или подсказки здесь были бы очень кстати.

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

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

Если нужна дополнительная информация, спрашивайте.

Было решение из другого места, где это кажется хорошим.

WHILE 1 = 1
BEGIN
    BEGIN TRANSACTION
        UPDATE TOP (1000) ca
        UPDATE p
        SET p.Modified = p.Created
        FROM people p
        JOIN @temp t ON t.caID = p.caID
        WHERE p.Modified <> p.Created
        IF @@ROWCOUNT = 0 -- terminating condition;
        BEGIN
            COMMIT TRANSACTION
            BREAK
        END
    COMMIT TRANSACTION
WAITFOR DELAY '00:00:00.300';
END

Наряду с индексацией по временной таблице это, похоже, очень хорошо работает.

Похоже, в вашем коде есть ошибка. В предложении where вы использовали t.caID = p.ID, но вставили caID во временную таблицу. Что это такое?

M. Mohabbati 31.10.2018 11:10

Ваш запрос выглядит нормально, если не считать псевдонима pa., поскольку в вашем запросе нет псевдонима pa. Либо измените его на p, либо удалите его полностью, поскольку на самом деле это не требуется. Ваш UPDATE уже настроен / будет работать «в пакетном режиме» (sic), поэтому не нужно беспокоиться об этой части. Я бы написал этот запрос как: UPDATE p SET modified = p.created FROM people p INNER JOIN @temp t ON t.caId = p.caId;.

Richard Hansell 31.10.2018 11:11

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

Richard Hansell 31.10.2018 11:13

Извините, исправил ошибки в запросе.

JimmyPop13 31.10.2018 11:18

@ JimmyPop13. . . Есть вопрос, как делать пакетные обновления? Или вопрос в другом?

Gordon Linoff 31.10.2018 11:39

@GordonLinoff Это в основном то, как сделать пакетное обновление с объединением в нем. Как и в каждом примере, я обнаружил, что ни один из них не использует соединение.

JimmyPop13 31.10.2018 11:47
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
966
0

Другие вопросы по теме