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

Próbuję napisać zapytanie, które wyodrębnia i przekształca dane z tabeli, a następnie wstawia je do innej tabeli. Tak, to jest zapytanie do hurtowni danych i robię to w MS Access. Więc w zasadzie chcę jakieś zapytanie takie jak to:

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ś tego chciał?
 161
Author: David Basarab, 2008-09-16

9 answers

Brak "wartości" , brak nawiasu:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
 259
Author: pilsetnieks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 16:23:34

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ę zawierającą tylko kolumny na projekcji (te na SELECT).

 24
Author: Jorge Ferreira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 16:25:51

Usuń obie wartości i nawias.

INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1
 22
Author: GSerg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 16:24:34

Usuń {[0] } z twojego SQL.

 9
Author: Forgotten Semicolon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 16:23:01

Uważam, że Twoim problemem w tym przypadku jest słowo kluczowe "values". Używasz słowa kluczowego "values", gdy wstawiasz tylko jeden wiersz danych. Do wstawiania wyników select nie jest potrzebny.

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

From msdn :

Zapytanie o dołączenie wielu rekordów:

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

Zapytanie o dołączenie pojedynczego rekordu:

INSERT INTO target [(field1[, field2[, …]])]     
VALUES (value1[, value2[, …])
 7
Author: Sean,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-11 18:22:21

Usuń "wartości" podczas dodawania grupy wierszy i usuń dodatkowe nawiasy. Możesz uniknąć okrężnego odniesienia, używając aliasu dla avg (CurrencyColumn) (tak jak w twoim przykładzie) lub nie używając aliasu w ogóle.

Jeśli nazwy kolumn są takie same w obu tabelach, Twoje zapytanie będzie takie:

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

I to by działało bez aliasu:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn)
FROM Table1
GROUP BY LongIntColumn;
 3
Author: Chris OC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-15 05:08:15

Cóż myślę, że najlepszym sposobem będzie (będzie?) do zdefiniowania 2 zestawów rekordów i wykorzystania ich jako pośrednika między 2 tabelami.

  1. Otwórz oba zestawy rekordów
  2. Wyodrębnij dane z pierwszej tabeli (wybierz blablabla)
  3. zaktualizuj drugi zestaw rekordów o dane dostępne w pierwszym zestawie rekordów (dodając nowe rekordy lub aktualizując istniejące rekordy
  4. Zamknij oba zestawy rekordów

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

 2
Author: Philippe Grondier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 16:27:05

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
 2
Author: 2 revs, 2 users 77%PRITESH PARMAR PINTOO,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-11 18:14:37

Czy chcesz wstawić ekstrakcję 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

 1
Author: Iti Tyagi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-02 07:00:04