Wie kann ich den Inhalt einer großen Tabelle (1 m bis 5 m) effizient mischen? Es ist bekannt, dass die Spalte eindeutige Werte hat, aber Sie können davon ausgehen, dass alle Einschränkungen für diese Zwecke entfernt werden. Meine Kopfschmerzen sind hauptsächlich, weil ich die selbe Spalte aktualisiere, die ich auswähle. Mein Ziel ist es, dies mit PL/SQL zu tun, so dass ich programmatisch zusätzliche Aktionen wie die Protokollierung oder Aktualisierung anderer Tabellen ausführen kann.Eine Spalte zwischen Zeilen mischen
**Original table:**
+----+-----------+
| id | fname |
+----+-----------+
| 1 | mike |
| 2 | ricky |
| 3 | jane |
| 4 | august |
| 6 | dave |
| 9 | Jérôme |
+----+-----------+
**Possible output:**
+----+-----------+
| id | fname |
+----+-----------+
| 1 | dave |
| 2 | jane |
| 3 | mike |
| 4 | ricky |
| 6 | Jérôme |
| 9 | august |
+----+-----------+
Meine letzten Versuche haben einen Cursor zu erstellen, die over (order by dbms_random.value)
verwendet und versuchen, eine Zusammenführung zu tun oder vielleicht basierend auf rownum aktualisieren. Vielleicht kann ich die modifizierende Selbstbeschränkung umgehen, indem ich eine temporäre Tabelle von Arten erstelle? Ich bin mir ziemlich sicher, dass Oracle eine raffinierte Möglichkeit hat, dies zu tun, aber ich bin in meinen SQL-Fähigkeiten auf die grundlegenden CRUD-Befehle beschränkt.
Die vollständige Lösung ist hier, basierend auf Gordon Antwort:
merge into t
using (
select t.id, t2.name
from (select t.*, rownum as seqnum
from t
) t join
(select t.*, row_number() over (order by dbms_random.value) as seqnum
from t
) t2
on t.seqnum = t2.seqnum
) src
on (t.id = src.id)
when matched then update set t.name = src.name;
Danke für die Antwort, man Haarspalterei ich habe, ist, dass die t1 gerade sein sollte t . Wie auch immer, wie würde ich ein Update davon bekommen? Müsste ich eine Zusammenführungsanweisung basierend auf dieser Abfrage generieren? – user1
Ich konnte es mit Merge arbeiten, danke nochmal. Ich werde die vollständige Lösung in meiner Frage veröffentlichen. – user1