MySQL中无法在INSERT语句中使用UNION吗?

3
我有一个正常工作的select查询。但是当我将其包装到INSERT语句中时,我会收到一个错误。
错误1064-您的SQL语法有误;请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法使用方法,位于第3行附近:(SELECT DISTINCT NULL AS id,NULL AS core_value_id,NULL AS translation_id'
我可以通过为每个源表使用1个插入来解决此问题。但是有没有办法用单个查询来完成呢?为什么这不起作用?
以下是查询语句。
INSERT INTO `some_table`
(
(SELECT DISTINCT
NULL AS `id`,
NULL AS `core_value_id`,
NULL AS `translation_id`,
t1.`upc` AS `source_value`,
t1.`upc` AS `value`,
COUNT(*) AS `count`
FROM  `source_table_1` t1
GROUP BY `upc`)

UNION ALL
(SELECT DISTINCT
NULL,NULL,NULL,
t1.`upc`,
t1.`upc`,
COUNT(*) AS `count`
FROM  `source_table_2` t1
GROUP BY `upc`
)
ORDER BY `count` DESC
)

以下是表定义:

CREATE TABLE `some_table` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `core_value_id` int(11) DEFAULT NULL,
 `translation_id` int(11) DEFAULT NULL,
 `source_value` varchar(255) NOT NULL,
 `value` varchar(255) DEFAULT NULL,
 `count` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `core_value_id` (`core_value_id`),
 KEY `translation_id` (`translation_id`),
 KEY `source_value` (`source_value`),
 KEY `value` (`value`),
 KEY `count` (`count`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

source_tables看起来可能像这样:

CREATE TABLE `source_table_1` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `upc` bigint(20) DEFAULT NULL,
 PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8

UPC列会有如下数据:

123456789012
123456789013
123456789014
123456789015
123456789016
123456789017
1个回答

5
我猜你漏掉了在各个选择语句上方的 SELECT 子句。此外,括号也不适用。请尝试使用以下语句:
INSERT INTO `some_table`
SELECT      * 
FROM 
            (
             SELECT   DISTINCT NULL AS `id`, NULL AS `core_value_id`,
                      NULL AS `translation_id`, t1.`upc` AS `source_value`,
                      t1.`upc` AS `value`, COUNT(*) AS `count`
             FROM     `source_table_1` t1
             GROUP BY `upc`

             UNION ALL

             SELECT   DISTINCT NULL, NULL, NULL, t1.`upc`, t1.`upc`, 
                      COUNT(*) AS `count`
             FROM     `source_table_2` t1
             GROUP BY `upc`
            ) AS dt
ORDER BY    `count` DESC

啊谢谢,太好了!你需要添加的唯一一件事是在闭合括号后加上表别名。我只是在ORDER BY之前再放了一个“t1”,然后它就可以工作了。此外,我意识到在联合的每个SELECT中都不需要使用表别名,因为每个SELECT仅涉及一个表。 - Buttle Butkus
1
@ButtleButkus 是的,绝对没错。我只添加了一个.. 我错过了它。 - nawfal
1
@ButtleButkus 同样不必要的是每个联合查询的中间括号。 - nawfal
@ButtleButkus,理想情况下,您甚至不需要顶级的SELECT * FROM子句。您只需直接执行常规联合即可。但我认为这样不够优雅。 - nawfal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接