如何INSERT到从另一个表中提取的表记录

时间:2008-09-16 16:19:56

标签: sql ms-access

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

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

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

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

9 个答案:

答案 0 :(得分:272)

没有“VALUES”,没有括号:

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

答案 1 :(得分:25)

您有两种语法选项:

选项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上的列)的表。

答案 2 :(得分:23)

删除VALUES和括号。

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

答案 3 :(得分:10)

从SQL中删除VALUES

答案 4 :(得分:9)

我相信你在这个例子中的问题是“values”关键字。只插入一行数据时使用“values”关键字。要插入选择的结果,您不需要它。

另外,你真的不需要围绕select语句的括号。

来自msdn

多记录附加查询:

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

单记录追加查询:

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

答案 5 :(得分: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;

答案 6 :(得分:2)

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

  1. 打开两个记录集
  2. 从第一个表(SELECT blablabla)
  3. 中提取数据
  4. 使用第一个记录集中的可用数据更新第二个记录集(通过添加新记录或更新现有记录
  5. 关闭两个记录集
  6. 如果您计划更新来自不同数据库的表(即每个记录集可以拥有自己的连接......),此方法特别有用。

答案 7 :(得分:2)

将数据从一个表插入另一个表中的不同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

答案 8 :(得分:1)

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

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

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

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