Insert into ... values ( SELECT ... FROM ... )
-
09-06-2019 - |
Frage
Ich bin versucht zu INSERT INTO
eine Tabelle mit den input aus einer anderen Tabelle.Dies ist zwar durchaus möglich, für viele Datenbank-engines, die ich immer scheinen, um den Kampf zu erinnern, die richtige syntax für die SQL
engine of the day (MySQL, Oracle, SQL Server, Informix, und DB2).
Ist es eine silver-bullet syntax coming von einem SQL-standard (für Beispiel, SQL-92 -), die mir erlauben würde, legen Sie die Werte, ohne sich Gedanken über die zugrunde liegende Datenbank?
Lösung
Versuchen:
INSERT INTO table1 ( column1 )
SELECT col1
FROM table2
Dies ist die standard-ANSI-SQL und sollte auf jedem DBMS
Es funktioniert definitiv für:
- Oracle
- MS SQL Server
- MySQL
- Postgres
- SQLite v3
- Teradata
- DB2
- Sybase
- Vertica
- HSQLDB
- H2
- AWS RedShift
- SAP HANA
Andere Tipps
@Shadow_x99:Das sollte funktionieren, und Sie können auch über mehrere Spalten und anderen Daten auch:
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 nur benutzt habe diese syntax mit Access, SQL 2000/2005/Express, MySQL und PostgreSQL, so dass diejenigen, die abgedeckt werden sollten.Ein Kommentator hat darauf hingewiesen, dass es wird Arbeit mit SQLite3.
Um nur einen Wert in einen multi-Wert INSERT
aus einer anderen Tabelle habe ich Folgendes in SQLite3:
INSERT INTO column_1 ( val_1, val_from_other_table )
VALUES('val_1', (SELECT val_2 FROM table_2 WHERE val_2 = something))
Sowohl die Antworten, ich sehe einwandfrei funktionieren Informix speziell, und sind im Grunde standard-SQL., Dass ist, die notation:
INSERT INTO target_table[(<column-list>)] SELECT ... FROM ...;
funktioniert gut mit Informix, und ich würde erwarten, alle DBMS.(Mal nach 5 oder mehr Jahren, dies ist die Art von Sache, die MySQL nicht immer unterstützen;es hat jetzt anständige Unterstützung für diese Art von standard SQL-syntax und, AFAIK, es würde gut funktionieren, die auf dieser notation.) Die Spalte Liste ist freiwillig, aber gibt die Ziel-Spalten in der Reihenfolge, so dass die erste Spalte des Ergebnisses der SELECT-geht in der ersten Spalte aufgeführten, etc.In der Abwesenheit von der Liste Spalte die erste Spalte des Ergebnisses der SELECT-geht in der ersten Spalte der Zieltabelle.
Was können unterschiedlich sein zwischen den Systemen wird die notation verwendet, um zu identifizieren Tabellen in verschiedenen Datenbanken - der standard hat nichts zu sagen über die inter-Datenbank (geschweige inter-DBMS) - Operationen.Mit Informix können Sie verwenden die folgende notation, um zu identifizieren, eine Tabelle:
[dbase[@server]:][owner.]table
Das heißt, Sie können eine Datenbank, wahlweise Identifizierung der server, dass hosts, die Datenbank, wenn es ist nicht auf dem aktuellen server, optional gefolgt von einem Besitzer, dot, und schließlich der eigentliche name der Tabelle.Der SQL-standard verwendet den Begriff schema für das, was Informix ruft die Besitzer.So, in Informix, alle der folgenden Notationen identifizieren konnte eine Tabelle:
table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table
Der Besitzer im Allgemeinen braucht nicht zitiert zu werden;jedoch, wenn Sie tun, verwenden Sie Anführungszeichen, die Sie brauchen, um den Namen richtig geschrieben - es wird groß-und Kleinschreibung., Dass ist:
someone.table
"someone".table
SOMEONE.table
alle zu identifizieren, die derselben Tabelle.Informix-es ist ein mildes Komplikation mit der MODE-ANSI-Datenbanken, in denen Namen von Besitzer sind in der Regel in Großbuchstaben konvertiert (informix ist die Ausnahme).Das ist, in einem MODUS, ANSI Datenbank (nicht Häufig verwendet), können Sie schreiben:
CREATE TABLE someone.table ( ... )
und der name des Besitzers im system Katalog wäre "JEMAND", sondern als "jemand".Wenn Sie umschließen den Namen in doppelte Anführungszeichen, wirkt es wie eine durch Trennzeichen getrennte Bezeichner.Mit standard-SQL, begrenzte Bezeichner verwendet werden kann, viele Orte.Mit Informix können Sie Sie nutzen nur rund owner names-in anderen Kontexten, Informix behandelt sowohl in einfachen Anführungszeichen und doppelte Anführungszeichen als Zeichenfolgen und nicht als Trennung von single-quoted strings als strings and double-quoted strings als durch Trennzeichen getrennte Bezeichner.(Natürlich nur der Vollständigkeit halber, es gibt eine Umgebungsvariable, DELIMIDENT, dass kann eingestellt werden - auf einen Wert, aber Y ist am sichersten zu zeigen, dass doppelte Anführungszeichen immer surround begrenzte Bezeichner und einfache Anführungszeichen immer surround-strings.)
Beachten Sie, dass MS SQL-Server verwaltet werden, um [begrenzte Bezeichner] in eckige Klammern eingeschlossen.Es sieht komisch für mich, und sicherlich nicht Teil des SQL-Standards.
Die meisten Datenbanken befolgen Sie die basic-syntax
INSERT INTO TABLE_NAME
SELECT COL1, COL2 ...
FROM TABLE_YOU_NEED_TO_TAKE_FROM
;
Jede Datenbank, die ich verwendet haben, befolgen Sie diese syntax, nämlich DB2
, SQL Server
, MY SQL
, PostgresQL
Hinzufügen von etwas, das in der ersten Antwort, wenn wir wollen, dass nur wenige Datensätze aus einer anderen Tabelle (in diesem Beispiel nur eine):
INSERT INTO TABLE1
(COLUMN1, COLUMN2, COLUMN3, COLUMN4)
VALUES (value1, value2,
(SELECT COLUMN_TABLE2
FROM TABLE2
WHERE COLUMN_TABLE2 like "blabla"),
value4);
Dies kann getan werden, ohne Angabe der Spalten in der INSERT INTO
Teil, wenn Sie liefern Werte für alle Spalten in der SELECT
Teil.
Lassen Sie uns sagen, table1 hat zwei Spalten.Diese Abfrage sollte funktionieren:
INSERT INTO table1
SELECT col1, col2
FROM table2
Diese NICHT funktionieren WÜRDEN (Wert für col2
ist nicht angegeben):
INSERT INTO table1
SELECT col1
FROM table2
Ich bin mit MS-SQL-Server.Ich weiß nicht, wie andere RDMS Arbeit.
Statt VALUES
Teil INSERT
Abfrage einfach verwenden, SELECT
Abfrage, wie unten beschrieben.
INSERT INTO table1 ( column1 , 2, 3... )
SELECT col1, 2, 3... FROM table2
Dies ist ein weiteres Beispiel der Verwendung der Werte mit wählen:
INSERT INTO table1(desc, id, email)
SELECT "Hello World", 3, email FROM table2 WHERE ...
Einfach einfügen, wenn die Tabelle-Spalte-Sequenz bekannt ist:
Insert into Table1
values(1,2,...)
Einfaches einfügen zu erwähnen Spalte:
Insert into Table1(col2,col4)
values(1,2)
Bulk einfügen, wenn die Anzahl der ausgewählten Spalten einer Tabelle(#table2) sind gleich insertion Tabelle(Tabelle1)
Insert into Table1 {Column sequence}
Select * -- column sequence should be same.
from #table2
Bulk einfügen, wenn Sie möchten, fügen Sie nur in die gewünschte Spalte einer Tabelle(Tabelle1):
Insert into Table1 (Column1,Column2 ....Desired Column from Table1)
Select Column1,Column2..desired column from #table2
from #table2
Hier ist ein weiteres Beispiel, wo die Quelle ist mit mehr als einer Tabelle:
INSERT INTO cesc_pf_stmt_ext_wrk(
PF_EMP_CODE ,
PF_DEPT_CODE ,
PF_SEC_CODE ,
PF_PROL_NO ,
PF_FM_SEQ ,
PF_SEQ_NO ,
PF_SEP_TAG ,
PF_SOURCE)
SELECT
PFl_EMP_CODE ,
PFl_DEPT_CODE ,
PFl_SEC ,
PFl_PROL_NO ,
PF_FM_SEQ ,
PF_SEQ_NO ,
PFl_SEP_TAG ,
PF_SOURCE
FROM cesc_pf_stmt_ext,
cesc_pfl_emp_master
WHERE pfl_sep_tag LIKE '0'
AND pfl_emp_code=pf_emp_code(+);
COMMIT;
Hier ist, wie Sie zum einfügen von mehreren Tabellen.Dieses Besondere Beispiel ist, wo Sie eine mapping-Tabelle in eine viele zu viele " - Szenario:
insert into StudentCourseMap (StudentId, CourseId)
SELECT Student.Id, Course.Id FROM Student, Course
WHERE Student.Name = 'Paddy Murphy' AND Course.Name = 'Basket weaving for beginners'
(Ich begreife das matching auf der student name könnte mehr zurück, als einen Wert, aber Sie bekommen die Idee.Matching auf etwas anderes als eine Id ist erforderlich, wenn die Id ist eine Identity-Spalte und unbekannt ist.)
INSERT INTO yourtable
SELECT fielda, fieldb, fieldc
FROM donortable;
Dies funktioniert auf allen DBMS
Sie könnten versuchen, diese, wenn Sie möchten, fügen eine Spalte mit SELECT * INTO
Tabelle.
SELECT *
INTO Table2
FROM Table1;
Dies funktionierte für mich:
insert into table1 select * from table2
Der Satz ist ein wenig anders von Oracle.
Für Microsoft SQL Server, werde ich empfehlen, lernen, interpretieren die SYNTAX auf der MSDN-Website.Mit Google ist es einfacher als je zuvor, sich für die syntax.
Für diesen speziellen Fall versuchen
Google:einfügen site:microsoft.com
Das erste Ergebnis wird http://msdn.microsoft.com/en-us/library/ms174335.aspx
scrollen Sie nach unten, um das Beispiel ("Über das AUSWÄHLEN und AUSFÜHREN von Optionen zum einfügen von Daten aus anderen Tabellen") wenn Sie es schwierig finden, zu interpretieren, die syntax, die Sie am oberen Rand der Seite.
[ WITH <common_table_expression> [ ,...n ] ]
INSERT
{
[ TOP ( expression ) [ PERCENT ] ]
[ INTO ]
{ <object> | rowset_function_limited
[ WITH ( <Table_Hint_Limited> [ ...n ] ) ]
}
{
[ ( column_list ) ]
[ <OUTPUT Clause> ]
{ VALUES ( { DEFAULT | NULL | expression } [ ,...n ] ) [ ,...n ]
| derived_table <<<<------- Look here ------------------------
| execute_statement <<<<------- Look here ------------------------
| <dml_table_source> <<<<------- Look here ------------------------
| DEFAULT VALUES
}
}
}
[;]
Dies sollte für jedes andere RDBMS dort zur Verfügung.Es gibt keinen Punkt, in Erinnerung an all die syntax für alle Produkte, IMO.
Ich eigentlich lieber die folgenden SQL Server 2008:
SELECT Table1.Column1, Table1.Column2, Table2.Column1, Table2.Column2, 'Some String' AS SomeString, 8 AS SomeInt
INTO Table3
FROM Table1 INNER JOIN Table2 ON Table1.Column1 = Table2.Column3
Es entfällt der Schritt zum hinzufügen der Insert () - set, und wählen Sie einfach die Werte in die Tabelle ein.
Verwenden Sie einfach Klammern für WÄHLEN Sie Klausel in FÜGEN.Zum Beispiel so :
INSERT INTO Table1 (col1, col2, your_desired_value_from_select_clause, col3)
VALUES (
'col1_value',
'col2_value',
(SELECT col_Table2 FROM Table2 WHERE IdTable2 = 'your_satisfied_value_for_col_Table2_selected'),
'col3_value'
);
select *
into tmp
from orders
Sieht nett aus, funktioniert aber nur, wenn tmp nicht vorhanden ist (Sie schafft es und füllt).(In SQL Server)
Einfügen in bestehende tmp-Tabelle:
set identity_insert tmp on
insert tmp
([OrderID]
,[CustomerID]
,[EmployeeID]
,[OrderDate]
,[RequiredDate]
,[ShippedDate]
,[ShipVia]
,[Freight]
,[ShipName]
,[ShipAddress]
,[ShipCity]
,[ShipRegion]
,[ShipPostalCode]
,[ShipCountry] )
select * from orders
set identity_insert tmp off
Beste Weg zum einfügen mehrerer Datensätze aus anderen Tabellen.
INSERT INTO dbo.Users
( UserID ,
Full_Name ,
Login_Name ,
Password
)
SELECT UserID ,
Full_Name ,
Login_Name ,
Password
FROM Users_Table
(INNER JOIN / LEFT JOIN ...)
(WHERE CONDITION...)
(OTHER CLAUSE)
INSERT INTO FIRST_TABLE_NAME (COLUMN_NAME)
SELECT COLUMN_NAME
FROM ANOTHER_TABLE_NAME
WHERE CONDITION;
Zwei Ansätze für die insert into select-sub-query.
- Mit SELECT Unterabfrage zurückgeben von Ergebnissen mit Eine Zeile.
- Mit SELECT Unterabfrage zurückgeben von Ergebnissen mit Mehrere Zeilen.
1.Ansatz für Sie Mit SELECT Unterabfrage zurückgeben von Ergebnissen mit eine Zeile.
INSERT INTO <table_name> (<field1>, <field2>, <field3>)
VALUES ('DUMMY1', (SELECT <field> FROM <table_name> ),'DUMMY2');
In diesem Fall, es nimmt an, WÄHLEN Sie Sub-Abfrage nur eine Zeile zurückgibt, der das Ergebnis basiert auf, WO die Bedingung oder SQL-Aggregatfunktionen wie SUM, MAX, AVG, etc.Sonst wird es werfen Fehler
2.Ansatz für Sie Mit SELECT Unterabfrage zurückgeben von Ergebnissen mit mehrere Zeilen.
INSERT INTO <table_name> (<field1>, <field2>, <field3>)
SELECT 'DUMMY1', <field>, 'DUMMY2' FROM <table_name>;
Der zweite Ansatz funktioniert in beiden Fällen.
Wenn Sie gehen, LEGEN Sie die WERTE der route auf mehrere Zeilen einfügen, stellen Sie sicher, um die WERTE in die Sätze mit Klammern, also:
INSERT INTO `receiving_table`
(id,
first_name,
last_name)
VALUES
(1002,'Charles','Babbage'),
(1003,'George', 'Boole'),
(1001,'Donald','Chamberlin'),
(1004,'Alan','Turing'),
(1005,'My','Widenius');
Ansonsten MySQL Objekte, "Column count doesn' T match value count at row 1", und Sie schreiben eine triviale post, wenn Sie endlich herausfinden, was zu tun ist.