从 UNION 创建临时 table 时遇到问题
Having issues creating a temporary table out of a UNION
我有一个 UNION 语句,它自己执行得很好:
SELECT "1999999999" AS MobileNo, "Test" AS FirstName, "Last" AS LastName, "268" AS TemplateID, "" AS MISC1, "" AS MISC2 UNION SELECT cust.cellp AS MobileNo, acct.firstname AS FirstName, acct.lastname AS LastName, "268" AS TemplateID, "" AS MISC1, "" AS MISC2 FROM acct INNER JOIN cust ON (cust.socsec=acct.socsec)
然而,当我尝试用 CREATE TEMPORARY 包装它时 TABLE:
CREATE TEMPORARY TABLE temptable (SELECT "1999999999" AS MobileNo, "Test" AS FirstName, "Last" AS LastName, "268" AS TemplateID, "" AS MISC1, "" AS MISC2 UNION SELECT cust.cellp AS MobileNo, acct.firstname AS FirstName, acct.lastname AS LastName, "268" AS TemplateID, "" AS MISC1, "" AS MISC2 FROM acct INNER JOIN cust ON (cust.socsec=acct.socsec))
我收到这个错误:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION SELECT cust.cellp AS MobileNo, acct.firstname AS FirstName, ac' at line 1
任一 SELECT 语句都可以与周围的 CREATE TEMPORARY TABLE 一起正常工作,只是 UNION 不起作用。返回的 MySQL 错误含糊不清,所以我不太清楚问题出在哪里。我尝试将每个 SELECT 语句包装在括号中,但它也不喜欢那样。
我知道理论上我可以使用一个 SELECT 创建临时 table,然后将第二个的数据添加到 table,但该解决方案不是在这种情况下确实可行,因为它是我正在使用的报告生成器,它非常严格地只允许一个 MySQL 语句作为输入,所以除非我想重新设计整个系统(我不想,管理层也不想我现在花时间在这上面)我必须找到一种方法来在一个 MySQL 语句中完成这项工作。
关于我在这里做错了什么有什么想法吗?
这里有一个解决方法:
CREATE TABLE AS
SELECT *
FROM (
SELECT ...
UNION ALL
SELECT ...
) AS foo
你不能直接为 create table
做联合,但你可以把它做成一个子 select:
mysql> create table foo as (select * from ((select 'foo') union all (select 'bar')) as foo);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
我有一个 UNION 语句,它自己执行得很好:
SELECT "1999999999" AS MobileNo, "Test" AS FirstName, "Last" AS LastName, "268" AS TemplateID, "" AS MISC1, "" AS MISC2 UNION SELECT cust.cellp AS MobileNo, acct.firstname AS FirstName, acct.lastname AS LastName, "268" AS TemplateID, "" AS MISC1, "" AS MISC2 FROM acct INNER JOIN cust ON (cust.socsec=acct.socsec)
然而,当我尝试用 CREATE TEMPORARY 包装它时 TABLE:
CREATE TEMPORARY TABLE temptable (SELECT "1999999999" AS MobileNo, "Test" AS FirstName, "Last" AS LastName, "268" AS TemplateID, "" AS MISC1, "" AS MISC2 UNION SELECT cust.cellp AS MobileNo, acct.firstname AS FirstName, acct.lastname AS LastName, "268" AS TemplateID, "" AS MISC1, "" AS MISC2 FROM acct INNER JOIN cust ON (cust.socsec=acct.socsec))
我收到这个错误:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNION SELECT cust.cellp AS MobileNo, acct.firstname AS FirstName, ac' at line 1
任一 SELECT 语句都可以与周围的 CREATE TEMPORARY TABLE 一起正常工作,只是 UNION 不起作用。返回的 MySQL 错误含糊不清,所以我不太清楚问题出在哪里。我尝试将每个 SELECT 语句包装在括号中,但它也不喜欢那样。
我知道理论上我可以使用一个 SELECT 创建临时 table,然后将第二个的数据添加到 table,但该解决方案不是在这种情况下确实可行,因为它是我正在使用的报告生成器,它非常严格地只允许一个 MySQL 语句作为输入,所以除非我想重新设计整个系统(我不想,管理层也不想我现在花时间在这上面)我必须找到一种方法来在一个 MySQL 语句中完成这项工作。
关于我在这里做错了什么有什么想法吗?
这里有一个解决方法:
CREATE TABLE AS
SELECT *
FROM (
SELECT ...
UNION ALL
SELECT ...
) AS foo
你不能直接为 create table
做联合,但你可以把它做成一个子 select:
mysql> create table foo as (select * from ((select 'foo') union all (select 'bar')) as foo);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0