it-swarm-eu.dev

So fügen Sie INSERT in eine Tabelle ein Datensätze, die aus einer anderen Tabelle extrahiert wurden

Ich versuche, eine Abfrage zu schreiben, die Daten aus einer Tabelle extrahiert und umwandelt, und diese Daten dann in eine andere Tabelle einzufügen. Ja, dies ist eine Data Warehousing-Abfrage und ich mache es 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 zu erhalten.

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

173
Martin08

Keine "WERTE", keine Klammer:

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

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

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

26
Jorge Ferreira

Entfernen Sie beide Werte und die Klammer.

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

Entfernen Sie VALUES aus Ihrem SQL.

10

Ich glaube, Ihr Problem ist in diesem Fall 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 nicht wirklich.

Von msdn :

Abfrage zum Anhängen mehrerer Datensätze:

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

Einzelne Datensatzanfügeabfrage:

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

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;
4
Chris OC

einfügen von Daten aus einer Tabelle in eine andere Tabelle in einer anderen DATABASE

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

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

  1. Öffnen Sie beide Recordsets
  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 Recordsets

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

2

Möchten Sie eine 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

1
Ashwin