SQLite-Kopierdaten von einer Tabelle in eine andere

76

SQLITE

Ich habe 2 Tabellen "Quelle" und "Ziel", die die gleichen Felder haben. ID und LAND, obwohl beide auch andere Felder haben, die nicht gemeinsam sind.

Ich muss den Source.Country-Wert in das Destination.Country kopieren, in dem sich der Join in der ID befindet

Für mein Leben kann ich Sqlite nicht dazu bringen, dies zu tun.

In SQL Server usw. ist dies eine super einfache Aufgabe.

Ideen?

Ian Vink
quelle
1
UPDATE Destination SET country = (Land aus Quelle auswählen, wobei id = Destination.id) WHERE EXISTS (1 aus Quelle auswählen, wobei id = Destination.id);
Ian Vink

Antworten:

152
INSERT INTO Destination SELECT * FROM Source;

Eine formale Definition finden Sie unter SQL als von SQLite verstanden: INSERT .

Joschi
quelle
2
Das funktioniert nicht, da ich mich dem ID-Feld anschließen und nur ein Feld (Land) aktualisieren muss.
Ian Vink
5
Sie können den Ausdruck in der SELECTAbfrage leicht an Ihr tatsächliches Tabellenschema anpassen.
Joschi
5
Hinweis für Noobs (wie ich). Wenn Sie mehrere Werte verwenden, müssen Sie Ihre SELECTAbfrage in Klammern setzen, z. B.INSERT INTO users2(name, name2) VALUES ((SELECT name FROM users),(SELECT name2 FROM users));
ice
1
@ice ツ Dies fügt nur einen Datensatz in die Tabelle ein, obwohl ich mehrere Datensätze in meiner Benutzertabelle habe
Amardeep Kumar Agrawal
11

Wenn in beiden Tabellen bereits Daten vorhanden sind und Sie die Werte einer Tabellenspalte basierend auf einer bestimmten Bedingung aktualisieren möchten, verwenden Sie diese Option

UPDATE Table1 set Name=(select t2.Name from Table2 t2 where t2.id=Table1.id)
W00di
quelle
Dadurch werden Daten aus Tabelle1 gelöscht, wenn Tabelle2 weniger Zeilen als Tabelle1 enthält.
Zelusp
4

Ich habe damit gerungen und weiß, dass es andere Möglichkeiten gibt, aber ich bin zu dem Schluss gekommen, dass das sicherste Muster ist:

create table destination_old as select * from destination;

drop table destination;

create table destination as select
d.*, s.country
from destination_old d left join source s
on d.id=s.id;

Es ist sicher, weil Sie eine Kopie davon haben, destinationbevor Sie sie geändert haben. Ich vermute, dass Update-Anweisungen mit Joins nicht in SQLite enthalten waren, da sie leistungsstark, aber etwas riskant sind.

Wenn Sie das obige Muster verwenden, erhalten Sie zwei countryFelder. Sie können dies vermeiden, indem Sie explizit alle Spalten angeben, aus denen Sie abrufen möchten, destination_oldund möglicherweise verwenden coalesce, um die Werte abzurufen, destination_oldwenn das countryFeld in sourcenull ist. Also zum Beispiel:

create table destination as select
d.field1, d.field2,...,coalesce(s.country,d.country) country
from destination_old d left join source s
on d.id=s.id;
Max
quelle
1

Wenn Sie solche Daten kopieren, bedeutet dies wahrscheinlich, dass Ihr Datenmodell nicht vollständig normalisiert ist, oder? Ist es möglich, eine Liste von Ländern zu erstellen und mehr beizutreten?

Anstelle eines JOIN können Sie auch virtuelle Tabellen verwenden, damit Sie die Abfragen in Ihrem System nicht ändern müssen.

Niels Bom
quelle
Wir aktualisieren von einer Tabelle in eine andere. Dies ist nur eine Übung zur Datenbereinigung. Ich muss nur die Länderfelder aktualisieren (Rechtschreibänderungen)
Ian Vink