簡體   English   中英

根據先前查詢的結果集更新百萬行

[英]updating million rows based on resultset from previous query

我需要更新包含百萬行的表

有兩個表table1和table2

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>
);

您為什么不能簡單地像下面這樣。 雖然我真的沒有看到需要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

編輯:

您也可以將第一個查詢的結果存儲在臨時表中(如a_horse_with_no_name所建議的那樣 ),然后對臨時表使用JOIN進行更新。 像下面這樣

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
  1. 將第一個查詢的結果輸出到文件中。
  2. 將輸出轉換為update語句,每個id一次更新(使用sed或其他方法)
  3. 將語句拆分為單獨的文件,每個文件可能拆分為1000(使用split或其他方式)
  4. 使用簡單的運行程序腳本,將每個文件作為sql腳本運行,並在每次執行之間有一個暫停(例如10秒)(以允許日志更新等並分散負載),並使用簡單的運行程序腳本在文件上循環

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM