184

我正在尝试编写一个查询,从表中提取和转换数据,然后将这些数据插入到另一个表中。是的,这是一个数据仓库查询,我在 MS Access 中进行。所以基本上我想要一些这样的查询:

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

我试过但收到语法错误消息。

如果你想这样做,你会怎么做?

4

9 回答 9

291

没有“价值”,没有括号:

INSERT INTO Table2(LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) as CurrencyColumn1 FROM Table1 GROUP BY LongIntColumn1;
于 2008-09-16T16:23:34.010 回答
29

您有两个语法选项:

选项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

选项 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

请记住,选项 2 将创建一个表,其中仅包含投影上的列(SELECT 上的列)。

于 2008-09-16T16:25:51.773 回答
25

删除 VALUES 和括号。

INSERT INTO Table2 (LongIntColumn2, CurrencyColumn2)
SELECT LongIntColumn1, Avg(CurrencyColumn) FROM Table1 GROUP BY LongIntColumn1
于 2008-09-16T16:24:34.850 回答
11

我相信您在这种情况下的问题是“值”关键字。当您只插入一行数据时,您使用“值”关键字。对于插入选择的结果,您不需要它。

此外,您真的不需要 select 语句周围的括号。

来自msdn

多记录追加查询:

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

单记录追加查询:

INSERT INTO target [(field1[, field2[, …]])]     
VALUES (value1[, value2[, …])
于 2008-09-16T16:27:46.027 回答
10

VALUES从您的 SQL 中删除。

于 2008-09-16T16:23:01.953 回答
4

附加一组行时删除“值”,并删除多余的括号。您可以通过使用 avg(CurrencyColumn) 的别名(如您在示例中所做的那样)或根本不使用别名来避免循环引用。

如果两个表中的列名相同,您的查询将如下所示:

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

它可以在没有别名的情况下工作:

INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn)
FROM Table1
GROUP BY LongIntColumn;
于 2008-09-16T16:40:58.930 回答
2

好吧,我认为最好的方法是(将是?)定义 2 个记录集并将它们用作 2 个表之间的中间体。

  1. 打开两个记录集
  2. 从第一个表中提取数据(SELECT blablabla)
  3. 使用第一个记录集中可用的数据更新第二个记录集(通过添加新记录或更新现有记录
  4. 关闭两个记录集

如果您计划从不同的数据库更新表(即每个记录集可以有自己的连接......),这种方法特别有趣。

于 2008-09-16T16:27:05.763 回答
2

将数据从一张表插入到不同数据库中的另一张表中

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
于 2008-12-08T09:19:36.503 回答
1

是否要在现有表中插入提取?

如果没关系,那么您可以尝试以下查询:

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

它将使用提取的信息创建一个新表-> T1

于 2008-09-16T16:34:27.197 回答