如何将表插入到另一个表中的记录插入


177

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

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

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

如果您想这样做,该怎么办?

Answers:


283

没有“ VALUES”,没有括号:

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

11
实际上如果没有。列的类型及其类型相同,并且表中的列以相同顺序退出,那么您可以简单地说:INSERT INTO Table2 SELECT * FROM table1;
sactiw

28

您有两个语法选项:

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


24

删除VALUES和括号。

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


10

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

另外,您实际上不需要select语句周围的括号。

来自msdn

多记录追加查询:

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

单记录追加查询:

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

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;

2

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

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

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


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

1

您要在现有表中插入提取吗?

如果没关系,则可以尝试以下查询:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.