Ich habe viel gesucht und konnte meine Frage noch nicht beantworten.
Also, ich muss eine Menge Daten (Millionen von Zeilen) in verschiedenen Tabellen erzeugen, und dieses Skript sollte schnell sein. Lassen Sie uns nun über drei spezifische Tabellen sprechen, in diese ID Reihen gibt es:SQL, ORACLE: Aktualisiere den Wert einer Spalte mit verschiedenen Werten
- in Tabelle Owners die ID beginnt von 10000, um 1 erhöht (mit Sequenz)
- in Tabelle Autos die ID beginnt bei 10000000, erhöht um 1 (mit Sequenz).
In der dritten Tabelle, genannt Eigentum, muss ich diese IDs mit einigen spezifischen Raten "merge":
- 50% der Besitzer haben 1 Auto
- 20% die übrigen Eigentümer haben 2 Autos
- 10-10-10% des Restes wird 3 haben, 4 und 5 Autos
Wichtige Dinge:
- Hinweis für Owners und Autos Tabellen: Die Preise: 100 Einheit Eigentümer, werden 210 Einheit Autos erzeugt werden, und in der Eigentümer Tabelle werden die Autos eindeutig sein, so 210 Zeilen werden in dieser Tabelle werden auch
- zuerst die Owners, dann sind die Autos Zeilen werden
- dann erzeugt werden ich in sert in die Eigentümer Tabelle einige Werte "von" Autos
Hinweise: Hier ist, wie ich Zeilen erzeugt in Autos (Owners ähnlich ist)
(Es wird v_custom_unit Stücke erzeugen Zeilen, diese Einheit wird aus den Raten berechnet, die ich vor ein paar Zeilen geben (für 100 Besitzer Einheit 210 Einheiten Autos generiert werden und 210 Einheiten Eigentum), und dann habe ich eine for-Schleife verwendet, um die Zeilen zu multiplizieren):
insert /*+ APPEND */ into Cars(
carId
, carType
, ...
)
select /*+ PARALLEL */
seq_carid.nextval as carId
, REGEXP_SUBSTR('Suziki,Toyota,Subaru,Saab,Hyundai,Opel,Volkswagen', '([^,]+)', 1, ROUND(DBMS_RANDOM.VALUE(1,7))) as carType
, ...
from dual
connect by level <= v_custom_unit;
Multiplying ist wie folgt:
FOR i in 1..v_forSteps LOOP
EXECUTE IMMEDIATE '
insert /*+ APPEND */ into Cars (
carId,
, carType,
, ...
)
SELECT /*+ PARALLEL */
seq_carid.nextval as carId,
, carType
, ...
FROM Cars
WHERE ROWNUM <= ' || v_custom_unit;
COMMIT;
END LOOP;
Der nächste Schritt ist Eigentümer Zeilen zu generieren:
insert /*+ APPEND */ into Ownership (
ownerId
, carId
, date_bought
)
select /*+ PARALLEL */
1
, c.carId
, some_random_date as date_bought
from Cars c;
kommt mein Problem: Jedes Auto ist im Eigentum mit ownerId = 1.
Meine Frage ist: Wie kann ich die Ownership Tabelle mit verschiedenen Besitzerwerten in einem einzigen Update aktualisieren (und vielleicht die Raten (50% -20% -10% -10% -10%) beibehalten)?
Vielen Dank für Ihre Antwort! Leider habe ich eine neue Information erhalten, nachdem ich die Frage gestellt habe, die die Datengenerierung einfacher gemacht hat, aber ich werde das als Antwort akzeptieren, weil es nützlich ist und ich hätte mit den Zahlen in der Abfrage arbeiten müssen, um mehr Zeilen zu generieren. Bald werde ich meine Lösung teilen, wenn Sie (und jeder andere) daran interessiert ist. – Pohkalopokh