So führen Sie INSERT in eine Tabelle ein, die aus einer anderen Tabelle extrahiert wurde


177

Ich versuche, eine Abfrage zu schreiben, die Daten aus einer Tabelle extrahiert und transformiert und diese Daten dann in eine andere Tabelle einfügt. Ja, dies ist eine Data Warehousing-Abfrage, und ich mache sie in MS Access. Im Grunde möchte ich eine Abfrage wie diese:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2) VALUES
  (SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1);

Ich habe versucht, aber eine Syntaxfehlermeldung erhalten.

Was würden Sie tun, wenn Sie dies tun möchten?

Antworten:


283

Keine "WERTE", keine Klammern:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;

11
eigentlich wenn nein. Die Anzahl der Spalten und ihrer Typen ist gleich und diese werden in der gleichen Reihenfolge in den Tabellen beendet. Dann können Sie einfach sagen: INSERT INTO Table2 SELECT * FROM table1;
Sactiw

28

Sie haben zwei Syntaxoptionen:

Option 1

CREATE TABLE Table1 (
    id int identity(1, 1) not null,
    LongIntColumn1 int,
    CurrencyColumn money
)

CREATE TABLE Table2 (
    id int identity(1, 1) not null,
    LongIntColumn2 int,
    CurrencyColumn2 money
)

INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)

INSERT INTO Table2
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1

Option 2

CREATE TABLE Table1 (
    id int identity(1, 1) not null,
    LongIntColumn1 int,
    CurrencyColumn money
)

INSERT INTO Table1 VALUES(12, 12.00)
INSERT INTO Table1 VALUES(11, 13.00)


SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1
INTO Table2
FROM Table1
GROUP BY LongIntColumn1

Beachten Sie, dass Option 2 eine Tabelle nur mit den Spalten in der Projektion (denen in SELECT) erstellt.


24

Entfernen Sie beide WERTE und die Klammer.

INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1


10

Ich glaube, Ihr Problem in diesem Fall ist das Schlüsselwort "values". Sie verwenden das Schlüsselwort "values", wenn Sie nur eine Datenzeile einfügen. Zum Einfügen der Ergebnisse einer Auswahl benötigen Sie diese nicht.

Außerdem brauchen Sie die Klammern um die select-Anweisung wirklich nicht.

Von msdn :

Append-Abfrage mit mehreren Datensätzen:

INSERT INTO target [(field1[, field2[, …]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, …]
FROM tableexpression

Append-Abfrage mit einem Datensatz:

INSERT INTO target [(field1[, field2[, …]])]     
VALUES (value1[, value2[, …])

4

Entfernen Sie "Werte", wenn Sie eine Gruppe von Zeilen anhängen, und entfernen Sie die zusätzlichen Klammern. Sie können den Zirkelverweis vermeiden, indem Sie einen Alias ​​für avg (CurrencyColumn) verwenden (wie in Ihrem Beispiel) oder indem Sie überhaupt keinen Alias ​​verwenden.

Wenn die Spaltennamen in beiden Tabellen gleich sind, sieht Ihre Abfrage folgendermaßen aus:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn) as CurrencyColumn1
FROM Table1
GROUP BY LongIntColumn;

Und es würde ohne einen Alias ​​funktionieren:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn)
FROM Table1
GROUP BY LongIntColumn;

2

Nun, ich denke, der beste Weg wäre (wird?), 2 Recordsets zu definieren und sie als Zwischenstufe zwischen den 2 Tabellen zu verwenden.

  1. Öffnen Sie beide Datensätze
  2. Extrahieren Sie die Daten aus der ersten Tabelle (SELECT blablabla)
  3. Aktualisieren Sie das zweite Recordset mit den im ersten Recordset verfügbaren Daten (entweder durch Hinzufügen neuer Datensätze oder durch Aktualisieren vorhandener Datensätze
  4. Schließen Sie beide Datensätze

Diese Methode ist besonders interessant, wenn Sie Tabellen aus verschiedenen Datenbanken aktualisieren möchten (dh jedes Recordset kann eine eigene Verbindung haben ...).


2

Einfügen von Daten aus einer Tabelle in eine andere Tabelle in einer anderen DATENBANK

insert into DocTypeGroup 
    Select DocGrp_Id,DocGrp_SubId,DocGrp_GroupName,DocGrp_PM,DocGrp_DocType 
    from Opendatasource( 'SQLOLEDB','Data Source=10.132.20.19;UserID=sa;Password=gchaturthi').dbIPFMCI.dbo.DocTypeGroup

1

Möchten Sie die Extraktion in eine vorhandene Tabelle einfügen?

Wenn es keine Rolle spielt, können Sie die folgende Abfrage versuchen:

SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 INTO T1 FROM Table1 
GROUP BY LongIntColumn1);

Es wird eine neue Tabelle -> T1 mit den extrahierten Informationen erstellt

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.