2014-07-08 3 views
0

мне нужно обновить таблицу, состоящую из миллионов строкобновления миллионов строк на основе результирующего из предыдущего запроса

есть две таблицы table1 и таблица2

SELECT ID 
FROM (
select ID from table1 where<condition> 
) as result1 
INNER JOIN table2 ON result1.field=table2.field 
GROUPBY table2.field 
HAVING <condtion> 

и на этом @ resultset1 ID, я должен обновленная таблица 1

UPDATE table1 
SET x=true 
where ID EXISTS IN (@resultset1) 

Есть миллионы строк в обоих таблицах. как мне это сделать?

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

UPDATE table1 t1 
SET x=true 
WHERE <condition> AND EXISTS(
    SELECT* FROM (
     SELECT * 
     FROM table2 t2 
     WHERE t2.field = t1.field 
    ) AS result 
WHERE<condition on resultset field> 
); 
+0

шкала не имеет значения, что имеет значение это заявление для обновления данных. –

+0

Каков наилучший способ свести к минимуму время выполнения первого запроса и таблицы обновлений1? – user2368055

+0

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

ответ

0

Почему вы не можете просто сделать, как показано ниже. Хотя я действительно не вижу необходимости в group by и having, если это ваш фактический запрос.

UPDATE table1 
SET x=true 
where ID IN (
SELECT ID 
FROM (
select ID from table1 where<condition> 
) as result1 
INNER JOIN table2 ON result1.field=table2.field 
GROUPBY table2.field 
HAVING <condtion> 
) 

Еще один хороший вариант будет JOIN как результирующий набор, и сделать UPDATE как

UPDATE table1 t1 
JOIN 
(
SELECT ID 
FROM (
select ID from table1 where<condition> 
) as result1 
INNER JOIN table2 ON result1.field=table2.field 
GROUPBY table2.field 
HAVING <condtion> 
) X ON t1.ID = X.ID 
SET t1.x=true 

EDIT:

Также Вы можете сохранить результат кулачного запроса во временную таблицу (Как уже было предложено a_horse_with_no_name), а затем выполните UPDATE, используя JOIN с временной таблицей. Somethig, как показано ниже

create temporary table idtemp(ID INT); 

insert into idtemp 
SELECT ID 
FROM (
select ID from table1 where<condition> 
) result1 
INNER JOIN table2 ON result1.field=table2.field 
GROUPBY table2.field 
HAVING <condtion> 

Наконец сделать обновление как

UPDATE table1 t1 
JOIN idtemp it ON t1.ID = it.ID 
SET t1.x=true 
+0

Да, но проблема в том, что таблицы содержат миллионы строк, выполнение такого запроса будет зависать на сервере – user2368055

+0

@ user2368055, вы пробовали обе версии запроса, как в моем ответе? В любом случае, проверьте отредактированный ответ (в основном, часть 'EDIT:'). – Rahul

+0

Есть ли альтернатива для присоединения? – user2368055

0
  1. вывода результатов первого запроса в файл.
  2. Преобразовать выход для обновления заявления, одно обновление за идентификатору (с помощью СЭД или любой другой)
  3. Разделить заявления в отдельные файлы, возможно, 1000 в файл (с помощью расщепленных или любой другой)
  4. Выполнить каждый файл как SQL сценарий с паузой (например, 10 секунд) между каждым исполнением (чтобы разрешить журналы обновлять и т. д. и распространять нагрузку), используя простой скрипт бегуна, петли над файлами
Смежные вопросы