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?

War es hilfreich?

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.

  1. Mit SELECT Unterabfrage zurückgeben von Ergebnissen mit Eine Zeile.
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top