Ich versuche, INSERT INTO
eine Tabelle mit der Eingabe von einer anderen Tabelle. Obwohl dies für viele Datenbank-Engines durchaus machbar ist, scheint es mir immer schwer zu fallen, mich an die richtige Syntax für die SQL
Engine des Tages zu erinnern ( MySQL , Oracle , SQL Server , Informix und DB2 ).
Gibt es eine Silver-Bullet-Syntax aus einem SQL-Standard (z. B. SQL-92 ), mit der ich die Werte einfügen kann, ohne mir Gedanken über die zugrunde liegende Datenbank machen zu müssen?
sql
database
syntax
database-agnostic
ansi-sql-92
Claude Houle
quelle
quelle
Antworten:
Versuchen:
Dies ist Standard-ANSI-SQL und sollte auf jedem DBMS funktionieren
Es funktioniert definitiv für:
quelle
Claude Houles Antwort : Sollte gut funktionieren, und Sie können auch mehrere Spalten und andere Daten haben:
Ich habe diese Syntax nur mit Access, SQL 2000/2005 / Express, MySQL und PostgreSQL verwendet, daher sollten diese behandelt werden. Es sollte auch mit SQLite3 funktionieren.
quelle
Um nur einen Wert in einem Mehrfachwert
INSERT
aus einer anderen Tabelle zu erhalten, habe ich in SQLite3 Folgendes ausgeführt:quelle
INSERT
ist entwederVALUES
oder eineSELECT
Anweisung, nicht beide.INSERT INTO ... VALUES ([expr], [expr], ...)
und einer der Pfade in[expr]
ist{{NOT} EXISTS} ([select-stmt])
- beachten Sie, dass die Klammern um die select-Anweisung erforderlich sind ({}
dh optional)Beide Antworten, die ich sehe, funktionieren speziell in Informix und sind im Grunde Standard-SQL. Das heißt, die Notation:
funktioniert gut mit Informix und, wie ich erwarten würde, dem gesamten DBMS. (Vor fünf oder mehr Jahren hat MySQL diese Art von Dingen nicht immer unterstützt. Diese Standard-SQL-Syntax wird jetzt angemessen unterstützt, und AFAIK würde bei dieser Notation einwandfrei funktionieren.) Die Spaltenliste ist optional, gibt jedoch die Zielspalten nacheinander an, sodass die erste Spalte des Ergebnisses von SELECT in die erste aufgelistete Spalte usw. verschoben wird. Wenn keine Spaltenliste vorhanden ist, wird die erste Spalte des Ergebnisses von SELECT in die Spalte aufgenommen erste Spalte der Zieltabelle.
Was zwischen den Systemen unterschiedlich sein kann, ist die Notation, mit der Tabellen in verschiedenen Datenbanken identifiziert werden. Der Standard hat nichts über datenbankübergreifende Operationen (geschweige denn zwischen DBMS-Operationen) zu sagen. Mit Informix können Sie die folgende Notation verwenden, um eine Tabelle zu identifizieren:
Das heißt, Sie können eine Datenbank angeben und optional den Server identifizieren, auf dem sich diese Datenbank befindet, wenn sie sich nicht auf dem aktuellen Server befindet, gefolgt von einem optionalen Eigentümer, einem Punkt und schließlich dem tatsächlichen Tabellennamen. Der SQL-Standard verwendet den Begriff Schema für das, was Informix den Eigentümer nennt. In Informix kann daher jede der folgenden Notationen eine Tabelle identifizieren:
Der Eigentümer muss im Allgemeinen nicht angegeben werden; Wenn Sie jedoch Anführungszeichen verwenden, muss der Name des Eigentümers korrekt geschrieben werden. Dabei wird zwischen Groß- und Kleinschreibung unterschieden. Das ist:
Alle identifizieren dieselbe Tabelle. Bei Informix gibt es eine leichte Komplikation bei MODE ANSI-Datenbanken, bei denen Eigentümernamen im Allgemeinen in Großbuchstaben konvertiert werden (informix ist die Ausnahme). Das heißt, in einer MODE ANSI-Datenbank (nicht häufig verwendet) können Sie schreiben:
und der Name des Besitzers im Systemkatalog wäre "JEMAND" und nicht "jemand". Wenn Sie den Eigentümernamen in doppelte Anführungszeichen setzen, verhält er sich wie eine durch Trennzeichen getrennte Kennung. Mit Standard-SQL können begrenzte Bezeichner an vielen Stellen verwendet werden. Mit Informix können Sie sie nur für Eigentümernamen verwenden. In anderen Kontexten behandelt Informix sowohl Zeichenfolgen in einfachen als auch in doppelten Anführungszeichen als Zeichenfolgen, anstatt Zeichenfolgen in einfachen Anführungszeichen als Zeichenfolgen und Zeichenfolgen in doppelten Anführungszeichen als durch Trennzeichen getrennte Bezeichner zu trennen. (Der Vollständigkeit halber gibt es natürlich eine Umgebungsvariable, DELIMIDENT, die auf einen beliebigen Wert gesetzt werden kann, aber Y ist am sichersten, um anzuzeigen, dass doppelte Anführungszeichen immer begrenzte Bezeichner und einfache Anführungszeichen immer Zeichenfolgen umgeben.)
Beachten Sie, dass MS SQL Server die Verwendung von [durch Trennzeichen getrennten Bezeichnern] in eckigen Klammern ermöglicht. Es sieht für mich komisch aus und ist sicherlich nicht Teil des SQL-Standards.
quelle
So fügen Sie in der ersten Antwort etwas hinzu, wenn wir nur wenige Datensätze aus einer anderen Tabelle (in diesem Beispiel nur einen) möchten:
quelle
Die meisten Datenbanken folgen der grundlegenden Syntax.
Jede Datenbank habe ich verwendet diese Syntax folgen nämlich
DB2
,SQL Server
,MY SQL
,PostgresQL
quelle
Verwenden Sie anstelle eines
VALUES
Teils derINSERT
Abfrage einfach die folgendeSELECT
Abfrage.quelle
Zwei Ansätze zum Einfügen mit ausgewählter Unterabfrage.
1. Ansatz für With SELECT-Unterabfragen, die Ergebnisse mit einer Zeile zurückgeben .
In diesem Fall wird davon ausgegangen, dass die SELECT-Unterabfrage nur eine Ergebniszeile basierend auf der WHERE-Bedingung oder SQL-Aggregatfunktionen wie SUM, MAX, AVG usw. zurückgibt. Andernfalls wird ein Fehler ausgegeben
2. Ansatz für With SELECT-Unterabfragen, die Ergebnisse mit mehreren Zeilen zurückgeben .
Der zweite Ansatz funktioniert in beiden Fällen.
quelle
Dies kann ohne Angabe der Spalten im
INSERT INTO
Teil erfolgen, wenn Sie Werte für alle Spalten im Teil angebenSELECT
Teil angeben.Angenommen, Tabelle1 hat zwei Spalten. Diese Abfrage sollte funktionieren:
Dies würde NICHT funktionieren (Wert für
col2
ist nicht angegeben):Ich verwende MS SQL Server. Ich weiß nicht, wie andere RDMS funktionieren.
quelle
Dies ist ein weiteres Beispiel für die Verwendung von Werten mit select:
quelle
Einfaches Einfügen, wenn die Tabellenspaltenfolge bekannt ist:
Einfache Einfügung unter Angabe der Spalte:
Masseneinfügung, wenn die Anzahl der ausgewählten Spalten einer Tabelle (# table2) gleich der Einfügetabelle (Tabelle1) ist.
Masseneinfügung, wenn Sie nur in die gewünschte Spalte einer Tabelle (Tabelle1) einfügen möchten:
quelle
Hier ist ein weiteres Beispiel, bei dem die Quelle mit mehr als einer Tabelle erstellt wird:
quelle
Verwenden Sie einfach die Klammer für die SELECT- Klausel in INSERT. Zum Beispiel so:
quelle
So fügen Sie aus mehreren Tabellen ein. In diesem Beispiel haben Sie eine Zuordnungstabelle in einem Szenario mit vielen zu vielen:
(Mir ist klar, dass eine Übereinstimmung mit dem Schülernamen möglicherweise mehr als einen Wert zurückgibt, aber Sie haben die Idee. Eine Übereinstimmung mit etwas anderem als einer ID ist erforderlich, wenn die ID eine Identitätsspalte ist und unbekannt ist.)
quelle
Dies funktioniert auf allen DBMS
quelle
Sie können dies versuchen, wenn Sie alle Spalten mithilfe der
SELECT * INTO
Tabelle einfügen möchten .quelle
In SQL Server 2008 bevorzuge ich eigentlich Folgendes:
Der Schritt des Hinzufügens des Insert () - Satzes entfällt, und Sie wählen einfach aus, welche Werte in die Tabelle aufgenommen werden sollen.
quelle
Das hat bei mir funktioniert:
Der Satz unterscheidet sich ein wenig von dem von Oracle.
quelle
Für Microsoft SQL Server empfehle ich, das Interpretieren des auf MSDN bereitgestellten SYNTAX zu lernen. Mit Google ist es einfacher als je zuvor, nach Syntax zu suchen.
Versuchen Sie es in diesem speziellen Fall
Das erste Ergebnis ist http://msdn.microsoft.com/en-us/library/ms174335.aspx
Scrollen Sie nach unten zum Beispiel ("Verwenden der Optionen SELECT und EXECUTE zum Einfügen von Daten aus anderen Tabellen"), wenn Sie Schwierigkeiten haben, die oben auf der Seite angegebene Syntax zu interpretieren.
Dies sollte für alle anderen dort verfügbaren RDBMS gelten. Es macht keinen Sinn, sich die gesamte Syntax für alle IMO-Produkte zu merken.
quelle
quelle
Sieht gut aus, funktioniert aber nur, wenn tmp nicht vorhanden ist (erstellt und füllt). (SQL Server)
So fügen Sie in eine vorhandene tmp-Tabelle ein:
quelle
Der beste Weg, um mehrere Datensätze aus anderen Tabellen einzufügen.
quelle
Wenn Sie die Route INSERT VALUES verwenden, um mehrere Zeilen einzufügen, stellen Sie sicher, dass Sie die VALUES in Klammern in Gruppen einteilen.
Andernfalls wendet MySQL an, dass "Spaltenanzahl nicht mit Wertanzahl in Zeile 1 übereinstimmt", und Sie schreiben am Ende einen trivialen Beitrag, wenn Sie endlich herausfinden, was Sie dagegen tun sollen.
quelle
WENN Sie einige Daten in eine Tabelle einfügen möchten, ohne einen Spaltennamen schreiben zu wollen.
Wo die Tabellen sind:
Ergebnis:
quelle
In informix funktioniert es wie Claude sagte:
quelle
Postgres unterstützt next: create table company.monitor2 als select * from company.monitor;
quelle