it-swarm.cn

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

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

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

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

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

171
Martin08

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

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

您有两种语法选项:

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

25
Jorge Ferreira

删除VALUES和括号。

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

从SQL中删除VALUES

10
Forgotten Semicolon

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

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

来自 msdn

多记录追加查询:

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

单记录追加查询:

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

在追加一组行时删除“值”,并删除多余的括号。您可以通过使用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;
4
Chris OC

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

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

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

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

2
Philippe Grondier

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

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

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

它将创建一个新表 - > T1,其中包含提取的信息

1
Ashwin