Zwar gibt es wahrscheinlich ein UPDATE äquivalent, ziehe ich MERGE zu verwenden, wenn eine SQL-Anweisung treibt, welche Zeilen aktualisiert werden müssen und die Werte zu erzeugen mit zur gleichen Zeit zu aktualisieren.
Also so etwas? (Ich gehe davon aus, dass f.pos_key ist eine eindeutige Kennung auf dieser f_pos_daily Tabelle. Wenn das nicht der Fall und die Abfrage gibt mehr als eine Zeile für den gleichen f_pos_key Wert, dies fehl.)
MERGE INTO edw.f_pos_daily f_main
USING (
select f.pos_key -- this is for joining back to the rows that need to be updated...
, dedup.retail_sku_key dedup_key -- ...and this is the value to update them with
from edw.f_pos_daily f
, edw.d_retail_sku sku
, edw.d_retail_sku_new dedup
where f.retail_sku_key = sku.retail_sku_key
and sku.retail_sku = dedup.retail_sku
and sku.mtd_item_number = dedup.mtd_item_number
and sku.retailer = dedup.retailer
and f.retail_sku_key <> dedup.retail_sku_key
) qry
ON (f_main.pos_key = qry.pos_key)
WHEN MATCHED THEN
UPDATE SET f_main.retail_sku_key = qry.dedup_key
;
Wenn Sie müssen dies in separate Updates aufteilen, die Sie in conquer auf zwei Arten teilen können:
1) Isolieren Sie Partitionen in f_pos_daily in der internen Abfrage (vorausgesetzt, die Tabelle ist partitioniert durch etwas anderes als retail_sku_key) z FROM edw.f_pos_daily PARTITION (p_some_partition_name)
und die obige Aussage einmal für jede Partition ausgeführt
2) Generieren Bereiche der Zeilen zu aktualisieren (auch hier mit der f_pos_key = eindeutige Annahme), die jeweils etwa 10% der Zeilen aktualisiert:
SELECT MIN(f_pos_key) c0,
PERCENTILE_DISC(0.1) WITHIN GROUP (ORDER BY f_pos_key) p1,
PERCENTILE_DISC(0.2) WITHIN GROUP (ORDER BY f_pos_key) p2,
PERCENTILE_DISC(0.3) WITHIN GROUP (ORDER BY f_pos_key) p3,
PERCENTILE_DISC(0.4) WITHIN GROUP (ORDER BY f_pos_key) p4,
PERCENTILE_DISC(0.5) WITHIN GROUP (ORDER BY f_pos_key) p5,
PERCENTILE_DISC(0.6) WITHIN GROUP (ORDER BY f_pos_key) p6,
PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY f_pos_key) p7,
PERCENTILE_DISC(0.8) WITHIN GROUP (ORDER BY f_pos_key) p8,
PERCENTILE_DISC(0.9) WITHIN GROUP (ORDER BY f_pos_key) p9,
MAX(f_pos_key) c4
FROM edw.f_pos_daily;
Wenn die Werte zwischen 0 und 1000 (und einige unbekannte Anzahl von Zeilen) reichte, wird diese Ihnen Ausgang geben wie:
P0 P1 P2 P3 P4 P5 P6 P7 P8 P9 P10
0 104 183 319 402 512 607 723 810 914 1000
von hier hat man nur eine weitere Bedingung in der Unterabfrage enthalten müssen haben
AND f.pos_key BETWEEN 0 AND 104
auf dem ersten Lauf dann
AND f.pos_key BETWEEN 105 AND 183
auf dem zweiten Durchlauf, und so weiter.
Sie können versuchen, BULK COLLECT FORALL Update als Daten zu verwenden. Am besten, um große Daten zu aktualisieren –
Was ist Ihre Frage - wie wird ein korreliertes Update durchgeführt? Ob das Update in einem Treffer oder in Stufen basierend auf Datumsbereichen durchgeführt wird? Etwas anderes? Ein einzelnes Update wäre am effizientesten, wenn Sie genügend Speicherbereich zur Verfügung haben. –
Alex, ich würde gerne ein Corelated Update in einem Treffer machen, wenn möglich. Ich laufe auf Exadata und Platz ist kein Problem. –