关于sql:如何对插入到另一个表中的记录进行插入

关于sql:如何对插入到另一个表中的记录进行插入

How to do INSERT into a table records extracted from another table

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

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

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

如果要这样做,该怎么办?


没有" VALUES",没有括号:

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

您有两个语法选项:

选项1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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上的列)。


删除VALUES和括号。

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

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

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

来自msdn:

多记录追加查询:

1
2
3
INSERT INTO target [(field1[, field2[,]])] [IN externaldatabase]
SELECT [SOURCE.]field1[, field2[,]
FROM tableexpression

单记录追加查询:

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

从SQL中删除VALUES


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

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

1
2
3
4
INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn) AS CurrencyColumn1
FROM Table1
GROUP BY LongIntColumn;

它无需别名即可工作:

1
2
3
4
INSERT INTO Table2 (LongIntColumn, Junk)
SELECT LongIntColumn, avg(CurrencyColumn)
FROM Table1
GROUP BY LongIntColumn;


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

1
2
3
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个记录集,并将它们用作2个表之间的中间。

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


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

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

    1
    2
    SELECT LongIntColumn1, Avg(CurrencyColumn) AS CurrencyColumn1 INTO T1 FROM Table1
    GROUP BY LongIntColumn1);

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


    推荐阅读