Frage Einfügen in ... Werte (SELECT ... FROM ...)


ich versuche zu INSERT INTO eine Tabelle, die die Eingabe aus einer anderen Tabelle verwendet. Obwohl dies für viele Datenbank - Engines völlig durchführbar ist, habe ich immer Mühe, mich an die korrekte Syntax für die Datenbank zu erinnern SQL Motor des Tages (MySQL, Orakel, SQL Server, Informix, und DB2).

Gibt es eine Silver-Bullet-Syntax, die aus einem SQL-Standard stammt (z. B. SQL-92) das würde mir erlauben, die Werte ohne Sorge über die zugrunde liegende Datenbank einzufügen?


1093
2017-08-25 12:45


Ursprung


Antworten:


Versuchen:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2  

Dies ist Standard ANSI SQL und sollte auf jedem DBMS funktionieren

Es funktioniert definitiv für:

  • Orakel
  • MS SQL Server
  • MySQL
  • Postgres
  • SQLite v3
  • Teradata
  • DB2
  • Sybase
  • Vertica
  • HSQLDB
  • H2
  • AWS RedShift
  • SAP HANA

1277
2017-08-25 12:47



@Schatten_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 behandelt werden. Ein Kommentator hat darauf hingewiesen, dass es mit SQLite3 funktionieren wird.


775
2017-08-25 14:11



Um nur einen Wert in einem Mehrfachwert zu erhalten INSERT von einer anderen Tabelle habe ich folgendes in SQLite3 gemacht:

INSERT INTO column_1 ( val_1, val_from_other_table ) 
VALUES('val_1', (SELECT  val_2 FROM table_2 WHERE val_2 = something))

76
2018-01-10 23:46



Beide Antworten, die ich sehe, funktionieren in Informix genau und sind im Grunde Standard-SQL. Das heißt, die Notation:

INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;

funktioniert gut mit Informix und, ich würde erwarten, alle DBMS. (Einmal vor 5 oder mehr Jahren hat MySQL das nicht immer unterstützt; es hat nun eine angemessene Unterstützung für diese Art von Standard-SQL-Syntax und, AFAIK, würde es bei dieser Notation funktionieren.) Die Spaltenliste ist optional, zeigt aber die Zielspalten in der Reihenfolge an, so dass die erste Spalte des Ergebnisses von SELECT in die erste aufgelistete Spalte usw. geht. In Abwesenheit der Spaltenliste geht die erste Spalte des Ergebnisses von SELECT in die erste Spalte der Zieltabelle.

Was zwischen Systemen unterschiedlich sein kann, ist die Schreibweise, die verwendet wird, um Tabellen in verschiedenen Datenbanken zu identifizieren - der Standard sagt nichts über Inter-Datenbank- (geschweige denn Inter-DBMS) Operationen aus. Mit 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, die optional den Server identifiziert, der diese Datenbank hostet, wenn sie sich nicht auf dem aktuellen Server befindet, gefolgt von einem optionalen Besitzer, 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 eine der folgenden Notationen eine Tabelle identifizieren:

table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table

Der Besitzer muss im Allgemeinen nicht zitiert werden; Wenn Sie jedoch Anführungszeichen verwenden, müssen Sie den richtigen Namen des Besitzers richtig eingeben. Dabei wird die Groß- / Kleinschreibung beachtet. Das ist:

someone.table
"someone".table
SOMEONE.table

Alle identifizieren dieselbe Tabelle. Bei Informix gibt es eine leichte Komplikation bei MODE ANSI-Datenbanken, bei denen die Besitzernamen in der Regel in Großbuchstaben umgewandelt werden (Informix ist die Ausnahme). Das heißt, in einer MODE ANSI-Datenbank (nicht allgemein verwendet) könnten Sie schreiben:

CREATE TABLE someone.table ( ... )

und der Name des Besitzers im Systemkatalog wäre "JEMAND" und nicht "jemand". Wenn Sie den Besitzernamen in doppelte Anführungszeichen einschließen, verhält er sich wie eine Begrenzungs-ID. Mit Standard-SQL können Begrenzungsbezeichner an vielen Stellen verwendet werden. Mit Informix können Sie sie nur um Eigentümernamen verwenden. In anderen Kontexten behandelt Informix sowohl einfache als auch doppelte Anführungszeichenfolgen als Zeichenfolgen, anstatt einzelne Anführungszeichenfolgen als Zeichenfolgen und doppelte Anführungszeichenfolgen als begrenzte Bezeichner zu trennen. (Natürlich, nur der Vollständigkeit halber, gibt es eine Umgebungsvariable, DELIMIDENT, die gesetzt werden kann - auf jeden Wert, aber Y ist am sichersten - um anzuzeigen, dass doppelte Anführungszeichen immer abgegrenzte Bezeichner umgeben und einfache Anführungszeichen immer Zeichenfolgen umgeben.)

Beachten Sie, dass MS SQL Server die Verwendung von [Trennzeichen] in eckigen Klammern verwendet. Es sieht für mich komisch aus und ist sicherlich nicht Teil des SQL-Standards.


52
2017-09-28 03:18



Die meisten Datenbanken folgen der grundlegenden Syntax,

INSERT INTO TABLE_NAME
SELECT COL1, COL2 ...
FROM TABLE_YOU_NEED_TO_TAKE_FROM
;

Jede Datenbank, die ich verwendet habe, folgt nämlich dieser Syntax, DB2, SQL Server, MY SQL, PostgresQL


26
2018-04-01 10:09



Um etwas in der ersten Antwort hinzuzufügen, wenn wir nur wenige Datensätze aus einer anderen Tabelle (in diesem Beispiel nur eine) wollen:

INSERT INTO TABLE1
(COLUMN1, COLUMN2, COLUMN3, COLUMN4) 
VALUES (value1, value2, 
(SELECT COLUMN_TABLE2 
FROM TABLE2
WHERE COLUMN_TABLE2 like "blabla"),
value4);

26
2018-04-09 17:15



Dies kann ohne Angabe der Spalten in der INSERT INTO Teil, wenn Sie Werte für alle Spalten in der SELECT Teil.

Nehmen wir an, Tabelle1 hat zwei Spalten. Diese Abfrage sollte funktionieren:

INSERT INTO table1
SELECT  col1, col2
FROM    table2

Dies würde NICHT funktionieren (Wert für col2 ist nicht angegeben):

INSERT INTO table1
SELECT  col1
FROM    table2

Ich benutze MS SQL Server. Ich weiß nicht, wie andere RDMS funktionieren.


22
2017-10-16 14:19



Dies ist ein weiteres Beispiel, das Werte mit select verwendet:

INSERT INTO table1(desc, id, email) 
SELECT "Hello World", 3, email FROM table2 WHERE ...

16
2018-03-20 09:12



Einfache Einfügung, wenn Tabellenspaltenfolge bekannt ist:

    Insert into Table1
    values(1,2,...)

Einfache Einfügung Erwähnen Spalte:

    Insert into Table1(col2,col4)
    values(1,2)

Masseneinfügung, wenn die Anzahl der ausgewählten Spalten einer Tabelle (# table2) der Einfügetabelle entspricht (Tabelle 1)

    Insert into Table1 {Column sequence}
    Select * -- column sequence should be same.
       from #table2

Masseneinfügung, wenn Sie nur in die gewünschte Spalte einer Tabelle einfügen möchten (Tabelle 1):

    Insert into Table1 (Column1,Column2 ....Desired Column from Table1)  
    Select Column1,Column2..desired column from #table2
       from #table2

15
2018-02-13 12:23



Es ist einfach, statt VALUES Teil von INSERT Frage, benutze einfach SELECT Abfrage wie folgt.

INSERT INTO table1 ( column1 , 2, 3... ) SELECT col1, 2, 3... FROM table2

10
2018-04-21 10:31



INSERT INTO yourtable
SELECT fielda, fieldb, fieldc
FROM donortable;

Dies funktioniert auf allen DBMS


10
2018-05-20 08:44