LEGEN Sie mithilfe der SCHLEIFE mit SELECT
Ich versuche zum einfügen der Daten aus der anderen Tabelle über " EINFÜGEN/AUSWAHL-combo. Ich habe auch einstecken müssen-Inkrement mit spezifischen Berechnung. Allerdings kann ich nicht herausfinden, warum es nicht funktioniert.
Habe ich die Tabelle (temp_business_area) wie folgt:
----------
| bname |
----------
| London |
| Sydney |
| Kiev |
----------
Ich möchte diese in enum Tabelle:
-----------------------------------------------------------------
| identifier | language_id | code | data | company_limit |
----------------------------------------------------------------|
| BUSINESS_UNIT | 0 | 100 | London | 126 |
| BUSINESS_UNIT | 0 | 200 | Sydney | 126 |
| BUSINESS_UNIT | 0 | 300 | Kiev | 126 |
-----------------------------------------------------------------
Aber was ich bekomme ist diese:
-----------------------------------------------------------------
| identifier | language_id | code | data | company_limit |
----------------------------------------------------------------|
| BUSINESS_UNIT | 0 | 100 | London | 126 |
| BUSINESS_UNIT | 0 | 100 | Sydney | 126 |
| BUSINESS_UNIT | 0 | 100 | Kiev | 126 |
| BUSINESS_UNIT | 0 | 200 | London | 126 |
| BUSINESS_UNIT | 0 | 200 | Sydney | 126 |
| BUSINESS_UNIT | 0 | 200 | Kiev | 126 |
| BUSINESS_UNIT | 0 | 300 | London | 126 |
| BUSINESS_UNIT | 0 | 300 | Sydney | 126 |
| BUSINESS_UNIT | 0 | 300 | Kiev | 126 |
-----------------------------------------------------------------
Und hier ist mein loop.
BEGIN
FOR x IN 1 .. 3 LOOP
INSERT INTO enum (identifier, language_id, code, data, company_limit)
SELECT 'BUSINESS_UNIT', 0, x*100, bname, 126 FROM temp_business_area;
END LOOP;
END;
Ich kann nicht herausfinden, wo bin ich, macht Fehler. Hilfe?
Sie haben eine Schleife mit drei Iterationen und in jeder iteration wählen Sie alle Zeilen aus einer Tabelle mit drei Zeilen. Das macht 9 Zeilen insgesamt (3 x 3).
Ich weiß, in MySQL können Sie
Ich weiß, in MySQL können Sie
limit 20,10
um die bestimmte Zeile nicht sicher, dass oracle so suchen, wie die Umsetzung limit
in oracle könnte ein Hinweis SELECT 'BUSINESS_UNIT', 0, x*100, bname, 126 FROM temp_business_area limit x, 1
InformationsquelleAutor Jaanna | 2012-12-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du machst drei Einsätze für jeder Zeile in
temp_business_area
, das ist, warum Sie wind mit 9 Zeilen.Ihrer Beschreibung von dem, was Sie erreichen wollen, Sie brauchen nicht die Schleife um alle.
Nur mit einem einzigen insert:
Der SELECT-Anweisung return 3 Zeilen, und jede Zeile wird eingefügt, in der
enum
Tabelle. Dierow_number()
Funktion gibt einen increment Wert für jede Zeile (1,2,3), die multplied durch 100 ergibt den code, den Sie wollen.Bearbeiten
(nach David ' s Kommentare):
Die Verwendung der windowing-Funktion fügt ein bisschen ein Aufwand auf die Erklärung. Wenn die zusätzliche Kontrolle über die Nummerierung nicht benötigt, mit
ROWNUM
stattdessen wird ein bisschen mehr effizient (obwohl es keine Rolle mehr, nur für drei Zeilen).Ich glaube, dass Sie möchte vermeiden, ein Fenster nosort Betrieb, und werden weniger anfällig auf syntax-Fehler wie das weglassen der order by-Klausel in die windowing-Funktion (ähem) 🙂
Ich bin nicht mit viel Glück Lesen, erklären, planen, ... dbms_xplan-Ausgänge über sql fiddle ... keine Ahnung warum nicht, aber es sieht aus wie es läuft, erklären plan in den hintergrund, vor dem ausführen von Abfragen, so zeigt die pickler fetch plan für die table () - Funktion bla bla bla bla. Anyhoo, es zeigt mir ein Fenster nosort Betrieb, wenn ich eine einfache select mit der analytischen Funktion und wählen Sie dann "Ansicht erklären-plan". Mystery?
du hast Recht. Es ist so ein Schritt.
InformationsquelleAutor a_horse_with_no_name
können Sie auf zwei andere Varianten:
Variante 2
InformationsquelleAutor Andrey Khmelev