【问题标题】:MySQL create a table for an inner join UNION right joinMySQL 为内连接 UNION 右连接创建表
【发布时间】:2017-02-11 00:24:28
【问题描述】:

在我的 SQL 5.5 中:

尝试创建一个表,该表是表 A 和 B 的 INNER JOIN 和表 C 和 B 的 (UNION) RIGHT JOIN 的结果。

CREATE TABLE IF NOT EXISTS TABLE_NAME AS (

(SELECT a.column1, b.column2 FROM TABLEA AS a

INNER JOIN TABLEB AS b

ON a.column1 = b.column1)

UNION

(SELECT c.column1, b.column2 FROM TABLEC AS c

RIGHT JOIN TABLEB AS b

ON b.column1 = c.column1)

);

错误:

ERROR 1064 (42000) at line 11: 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 '(SELECT a.column1, b.column2 FROM TABLEA AS a

另一种尝试:

CREATE TABLE IF NOT EXISTS TABLE_NAME AS (

(SELECT a.column1, b.column2 FROM TABLEA AS a

INNER JOIN TABLEB AS b

ON a.column1 = b.column1)

UNION

(SELECT c.column1, b.column2 FROM TABLEC AS c

RIGHT JOIN TABLEB AS b

ON b.column1 = c.column1)

);

Error:

ERROR 1064 (42000) at line 11: 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

任何大师都可以提供一些建议吗?谢谢。

【问题讨论】:

  • 从维恩图中,我认为你需要LEFT JOIN,而不是RIGHT JOIN

标签: mysql join union


【解决方案1】:

试试这个

CREATE TABLE IF NOT EXISTS TABLE_NAME AS 
(
SELECT S.*
FROM
(
SELECT a.column1, b.column2 FROM TABLEA AS a
INNER JOIN TABLEB AS b ON a.column1 = b.column1
UNION
SELECT c.column1, b.column2 FROM TABLEC AS c
RIGHT JOIN TABLEB AS b ON b.column1 = c.column1
) S
);

【讨论】:

  • 遗憾的是,这个也不好用。它只是在第 11 行返回“ERROR 1146 (42S02):TABLE_NAME 不存在”。
  • 嗯。我对此进行了测试,它工作正常。您至少会注意到语法错误已经消失。
  • 嗨@P.Salmon,你在 MySQL 5.5 中吗?
  • 奇怪 - 我已经重现了这个错误,但无法解决它。我不确定 TABLE_NAME 是一个好的表名,因为 information_schema.tables 将此作为列并在各种系统表中用作列名。您是否尝试过 TABLE_NAME 以外的其他内容?
  • 是的,我对其他正常的非信息模式表名也有同样的错误,但仍然遇到相同的错误消息。恕我直言,这是一个 MySQL 错误。
【解决方案2】:

请尝试以下方法:

CREATE TABLE IF NOT EXISTS TABLE_NAME AS

(SELECT a.column1, b.column2 FROM TABLEA AS a

INNER JOIN TABLEB AS b

ON a.column1 = b.column1)

UNION

(SELECT c.column1, b.column2 FROM TABLEC AS c

RIGHT JOIN TABLEB AS b

ON b.column1 = c.column1)

See Demo


引用documentation

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
    [(create_definition,...)]
    [table_options]
    [partition_options]
    [IGNORE | REPLACE]
    [AS] query_expression

query_expression 不应被括号括起来

【讨论】:

  • 遗憾的是这不起作用:/。它只是说创建的表在以下步骤中不存在。我还尝试了“ CREATE TABLE IF NOT EXISTS TABLE_NAME (select ....”,它返回相同的错误消息
  • 嗨@1000111,谢谢你的2美分。我实际上在 MySQL 5.5 中,如果我们将 fiddle 更改为 MySQL 5.5,构建模式将显示未知错误:/
  • 奇怪,在 5.5.40 和 5.5.52 中对我来说效果很好。也许小提琴坏了?还是使用带有一些错误的旧版本 5.5?
  • 我不确定@RickJames。感谢您告知我们。
  • bugs.mysql.com/bug.php?id=72018 -- 对CREATE VIEW ... UNION... 的修复已添加到 5.5.39。不知道有没有影响到你的CREATE TABLE ... UNION...
猜你喜欢
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 2012-06-17
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多