Jak zrobić WSTAWIĆ do rekordów tabeli wyodrębnionych z innej tabeli

177

Próbuję napisać zapytanie, które wyodrębnia i przekształca dane z tabeli, a następnie wstawia te dane do innej tabeli. Tak, to jest zapytanie dotyczące hurtowni danych i robię to w MS Access. Zasadniczo potrzebuję takiego zapytania:

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

Próbowałem, ale otrzymałem komunikat o błędzie składni.

Co byś zrobił, gdybyś chciał to zrobić?

Martin08
źródło

Odpowiedzi:

283

Bez „WARTOŚCI”, bez nawiasów:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
pilsetnieks
źródło
11
właściwie jeśli nie. kolumn i ich typy są takie same, a te wyjścia w tej samej kolejności w tabelach, możesz po prostu powiedzieć: INSERT INTO Table2 SELECT * FROM table1;
sactiw
28

Masz dwie opcje składni:

opcja 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

Opcja 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

Należy pamiętać, że opcja 2 utworzy tabelę z tylko kolumnami na rzucie (te na SELECT).

Jorge Ferreira
źródło
24

Usuń zarówno WARTOŚCI, jak i nawiasy.

INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1
GSerg
źródło
10

Usuń VALUESze swojego SQL.

Zapomniany średnik
źródło
10

Uważam, że problemem w tym przypadku jest słowo kluczowe „wartości”. Używasz słowa kluczowego „wartości”, gdy wstawiasz tylko jeden wiersz danych. Nie potrzebujesz tego do wstawiania wyników selekcji.

Poza tym naprawdę nie potrzebujesz nawiasów wokół instrukcji select.

Z msdn :

Zapytanie dołączające wiele rekordów:

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

Zapytanie dołączające pojedynczy rekord:

INSERT INTO target [(field1[, field2[, …]])]     
VALUES (value1[, value2[, …])
Sean
źródło
4

Usuń „wartości”, gdy dołączasz grupę wierszy, i usuń dodatkowe nawiasy. Możesz uniknąć odwołania cyklicznego, używając aliasu dla avg (CurrencyColumn) (tak jak w przykładzie) lub w ogóle nie używając aliasu.

Jeśli nazwy kolumn są takie same w obu tabelach, zapytanie wyglądałoby tak:

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

I działałoby bez aliasu:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn)
FROM Table1
GROUP BY LongIntColumn;
Chris OC
źródło
2

Cóż, myślę, że najlepszym sposobem byłoby (będzie?) Zdefiniowanie 2 zestawów rekordów i użycie ich jako pośrednika między 2 tabelami.

  1. Otwórz oba zestawy rekordów
  2. Wyodrębnij dane z pierwszej tabeli (SELECT blablabla)
  3. Zaktualizuj drugi zestaw rekordów danymi dostępnymi w pierwszym zestawie (albo przez dodanie nowych rekordów, albo zaktualizowanie istniejących rekordów
  4. Zamknij oba zestawy rekordów

Ta metoda jest szczególnie interesująca, jeśli planujesz aktualizować tabele z różnych baz danych (tj. Każdy zestaw rekordów może mieć własne połączenie ...)

Philippe Grondier
źródło
2

wstawianie danych z jednej tabeli do innej tabeli w innej BAZIE DANYCH

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
PRITESH PARMAR PINTOO
źródło
1

Czy chcesz wstawić wyodrębnianie do istniejącej tabeli?

Jeśli to nie ma znaczenia, możesz wypróbować poniższe zapytanie:

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

Utworzy nową tabelę -> T1 z wyodrębnionymi informacjami

LipiecOrdinary
źródło