mysql中insert与select的嵌套使用解决组合字段插入问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql中insert与select的嵌套使用解决组合字段插入问题相关的知识,希望对你有一定的参考价值。

参考技术A 如何在mysql从多个表中组合字段然后插入到一个新表中,通过一条sql语句实现。具体情形是:有三张表a、b、c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段。对于这种情况,我们可以使用如下的语句来实现:
INSERT
INTO
db1_name(field1,field2)
SELECT
field1,field2
FROM
db2_name
当然,上面的语句比较适合两个表的数据互插,如果多个表就不适应了。对于多个表,我们可以先将需要查询的字段join起来,然后组成一个视图后再select
from就可以了:
INSERT
INTO
a(field1,field2)
SELECT
*
FROM(SELECT
f1,f2
FROM
b
JOIN
c)
AS
tb
其中f1是表b的字段,f2是表c的字段,通过join查询就将分别来自表b和表c的字段进行了组合,然后再通过select嵌套查询插入到表a中,这样就满足了我们这个场景了,如果需要不止2个表,那么可以多个join的形式来组合字段。需要注意的是嵌套查询部分最后一定要有设置表别名,如下:
SELECT
*
FROM(SELECT
f1,f2
FROM
b
JOIN
c)
AS
tb
即最后的as
tb是必须的(当然tb这个名称可以随意取),即指定一个别名,否则在mysql中会报如下错误:
ERROR
1248
(42000):
Every
derived
TABLE
must
have
its
own
alias
即每个派生出来的新表都必须指定别名才可以的。

MySQL INSERT INTO / ON DUPLICATE KEY 与 SELECT 语句问题

【中文标题】MySQL INSERT INTO / ON DUPLICATE KEY 与 SELECT 语句问题【英文标题】:MySQL INSERT INTO / ON DUPLICATE KEY with SELECT statement issue 【发布时间】:2010-12-15 07:07:12 【问题描述】:

你好 - 我是 MySQL 菜鸟。我有一个包含各种商业列表的表格,我正在尝试填充第二个名为城市的表格,其中包含唯一的城市名称以及每个城市的列表数量。我可以执行一个 SELECT 语句来获取这些数据,如下所示:

SELECT city,state,sum(count)
FROM (
SELECT city,state, 1 AS count FROM listings
) results
GROUP BY city
ORDER BY sum(count) DESC,city;

但是,现在我想更新表格,但我似乎无法获得正确的语句来工作。这是我拥有的最新版本,但我目前收到“无效使用组功能”错误。

INSERT INTO cities(city,state,size)
SELECT city,state,sum(count)
FROM (
SELECT city,state, 1 AS count FROM listings
) results
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), size=sum(count); 

感谢任何帮助!

【问题讨论】:

【参考方案1】:

像这样简单的东西会起作用吗?

insert into cities (city, state, size)
select city, state, count(*) as size from listings
group by city, state

group by 应该确保没有重复,这样就不需要on duplicate key。你正在做的 sum() + subquery 看起来你只是想做一个 count(*)。

您遇到的具体错误是由于 size=sum(count)。在批量插入中,执行此操作的正确方法是 size=values(size),请参阅values() 上的文档。

编辑:

如果它为每个城市添加另一个条目,那么城市上没有唯一索引,并且重复键无论如何都不会做任何事情。

如果您在 (city, state) 上添加唯一索引,则可以将 on duplicate key update size=values(size) 添加到上述查询中,它将更新每条记录。

【讨论】:

我想我们刚刚发布了相同的查询。 嗯,这可行,但它似乎是为每个重复的城市添加另一个条目,而不是更新前一个条目。我想这就是我通过声明的“ON DUPLICATE KEY UPDATE”部分得到的结果。 如果您先截断表格,则不需要 ON DUPLICATE KEY。但是如果你真的想要 UN DUPLICATE KEY(这不是一个坏方法),那么你需要在(城市,州)上有一个 PRIMARY 或 UNIQUE 键,而你可能没有。【参考方案2】:

试试这个,虽然我希望在向你释放它之前我有一些东西可以测试它。

insert into cities (city, state, size)
select city, state, count(*) AS size
from listings
group by city, state

【讨论】:

以上是关于mysql中insert与select的嵌套使用解决组合字段插入问题的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL INSERT SELECT 问题

MySQL LAST_INSERT_ID() 与 INSERT INTO tablea SELECT FROM tableb

Mysql 优化

oracle 中 select中嵌套select语法,该怎么处理

SQL Server 之 子查询与嵌套查询

MYSQL insert into select 锁表问题