2013-07-09 13 views
6

Hi ist es möglich, eine Tabelle mit Werten aus einer anderen Tabelle mit Limit und Offset zu aktualisieren?Update-Tabelle mit Limit und Offset in Postgres

zum Beispiel der Tabelle t_device hat 600 Zeilen und t_object hat 100 Zeilen

Ich mag eine Spalte aktualisieren, aber nur die ersten 100 Zeilen mit einem aus einer Unterabfrage Offset wie

update t_device set id_object = 
(select id_object from t_object limit 100) limit 100 offset 0; 

update t_device set id_object = 
(select id_object from t_object limit 100) limit 100 offset 100; 

ist es möglich? Ich kann nicht eine Lösung für modive den Wert in t_device von t_object

im finden Postgres 8,4

Antwort

7
  • Die UPDATE-Anweisung nicht, wie es mit nicht aussehen wird viel nützen, wenn Sie nur id_object setzen id_object , wenn auch in einer halb zufälligen Reihenfolge.
  • Wenn in der UPDATE-Anweisung der t_device-Tabelle kein eindeutiges WHERE-Prädikat vorhanden ist, gibt es keine Garantie, dass nur 100 Zeilen aktualisiert werden. Dies ist, wie ich annehme, die Absicht des äußeren LIMIT.
  • Sie sollten eine ORDER BY in der Unterabfrage haben, um sicherzustellen, dass Sie keine Überlappungen in Zeilen bekommen.

Etwas wie das Folgende könnte für Sie arbeiten.

UPDATE t_device set id_object = t.id_object 
FROM (select id_object from t_object order by id_object limit 100) t 
WHERE t.id_object = t_device.id_object; 
+0

mit „WHERE t.id_object = t_device. ID_Objekt; " Ich aktualisiere 0 Zeilen, weil sie keine Beziehung haben Ich muss nur immer 100 Zeilen in t_device mit Offsets 0, 100, 200 usw. mit den Werten von t_object nach ID sortiert (in dieser Tabelle sind das nur 103 Zeilen und in Gerät 600) –

0

i löste es mit einer Spalte rowNumber zu erzeugen und es mit inkrementalen Werten aktualisiert (1, 2, 3)

und dann

UPDATE t_device set id_object = t.id_object FROM 
(select t1.id_object , row_number() OVER (ORDER BY id_object) AS rn 
from dblink('dbname=*** password=***', 'select id_object from t_object') 
as t1(id_object int) order by id_object limit 103) as t 
where t_device.rowNumber = t.rn 
Verwandte Themen