Ich versuche, eine Tabelle "EINZUFÜGEN", indem ich die Eingabe aus einer anderen Tabelle verwende. Obwohl dies für viele Datenbank-Engines durchaus machbar ist, scheine ich mich immer an die korrekte Syntax für die jeweilige SQL
-Engine zu erinnern (MySQL, Oracle, SQL Server, Informix und DB2).
Gibt es eine aus einem SQL-Standard (z. B. SQL-92) stammende Syntax, mit der ich die Werte einfügen kann, ohne mich um die zugrunde liegende Datenbank zu kümmern?
Versuchen Sie es:
INSERT INTO table1 ( column1 )
SELECT col1
FROM table2
Dies ist Standard-ANSI-SQL und sollte mit jedem DBMS funktionieren.
Es funktioniert definitiv für:
@Shadow_x99: Das sollte gut funktionieren, und Sie können auch mehrere Spalten und andere Daten haben:
INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT table2.column1, table2.column2, 8, 'some string etc.'
FROM table2
WHERE table2.ID = 7;
Edit: Ich sollte erwähnen, dass ich diese Syntax nur mit Access, SQL 2000/2005/Express, MySQL und PostgreSQL verwendet habe, also sollten diese abgedeckt sein. Ein Kommentator hat darauf hingewiesen, dass es auch mit SQLite3 funktioniert.
Beide Antworten, die ich sehe, funktionieren speziell in Informix gut und sind im Grunde genommen Standard-SQL. Das heißt, die Notation:
INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;
funktioniert problemlos mit Informix und, wie ich annehme, mit allen DBMS. (Früher, vor 5 oder mehr Jahren, hat MySQL solche Dinge nicht immer unterstützt; jetzt hat es eine gute Unterstützung für diese Art von Standard-SQL-Syntax und, AFAIK, würde es mit dieser Notation gut funktionieren). Die Spaltenliste ist optional, gibt aber die Zielspalten in der Reihenfolge an, so dass die erste Spalte des Ergebnisses des SELECT in die erste aufgelistete Spalte geht, usw. Fehlt die Spaltenliste, geht die erste Spalte des Ergebnisses des SELECT in die erste Spalte der Zieltabelle.
Was sich zwischen den Systemen unterscheiden kann, ist die Notation, die zur Identifizierung von Tabellen in verschiedenen Datenbanken verwendet wird - der Standard sagt nichts über datenbankübergreifende (geschweige denn DBMS-übergreifende) Operationen aus. Bei Informix können Sie die folgende Notation verwenden, um eine Tabelle zu identifizieren:
[dbase[@server]:][owner.]table
Das heißt, Sie können eine Datenbank angeben, optional den Server, auf dem diese Datenbank liegt, wenn sie sich nicht auf dem aktuellen Server befindet, gefolgt von einem optionalen Eigentümer, einem Punkt und schließlich dem eigentlichen Tabellennamen. Der SQL-Standard verwendet den Begriff Schema für das, was Informix den Eigentümer nennt. In Informix kann also jede der folgenden Schreibweisen eine Tabelle bezeichnen:
table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table
Der Eigentümer muss im Allgemeinen nicht in Anführungszeichen gesetzt werden; wenn Sie jedoch Anführungszeichen verwenden, müssen Sie den Namen des Eigentümers richtig schreiben - es wird zwischen Groß- und Kleinschreibung unterschieden. Das heißt:
someone.table
"someone".table
SOMEONE.table
bezeichnen alle dieselbe Tabelle. Bei Informix gibt es eine kleine Komplikation mit MODE-ANSI-Datenbanken, bei denen Besitzernamen im Allgemeinen in Großbuchstaben umgewandelt werden (informix ist die Ausnahme). Das heißt, in einer MODE ANSI-Datenbank (die nicht häufig verwendet wird) könnten Sie schreiben:
CREATE TABLE someone.table ( ... )
und der Name des Eigentümers im Systemkatalog würde "SOMEONE" lauten und nicht "someone". Wenn Sie den Besitzernamen in Anführungszeichen setzen, wirkt er wie ein Bezeichner mit Trennzeichen. Bei Standard-SQL können begrenzte Bezeichner an vielen Stellen verwendet werden. In Informix können Sie sie nur im Zusammenhang mit Besitzernamen verwenden. In anderen Kontexten behandelt Informix sowohl Strings in einfachen als auch in doppelten Anführungszeichen als Strings, anstatt Strings in einfachen Anführungszeichen als Strings und Strings in doppelten Anführungszeichen als abgegrenzte Bezeichner zu trennen. (Der Vollständigkeit halber sei erwähnt, dass es eine Umgebungsvariable DELIMIDENT gibt, die auf einen beliebigen Wert gesetzt werden kann, wobei Y am sichersten ist, um anzugeben, dass doppelte Anführungszeichen immer begrenzte Bezeichner und einfache Anführungszeichen immer Zeichenketten umgeben).
Beachten Sie, dass MS SQL Server es schafft, [Begrenzte Bezeichner] in eckigen Klammern zu verwenden. Das sieht für mich seltsam aus und ist sicherlich nicht Teil des SQL-Standards.