【问题标题】:Mysql union clause identify tablesMysql union 子句识别表
【发布时间】:2012-09-03 09:18:42
【问题描述】:

我有一个 mysql 表,其中包含跨多个表的大量数据。因此,为了得到这一切,我认为最好的办法是使用 UNION 子句,但是我也想知道结果来自哪个表,因为有些表有多个值,有些是空的。

以下 sql 似乎不起作用,但我看不出有什么问题。

 (SELECT *, `2` AS 'cat' from `2` where `recid` = 'cneta0ld00ah')
  UNION
 (SELECT *, `3` AS 'cat' from `3` where `recid` = 'cneta0ld00ah')
  UNION
 (SELECT *, `4` AS 'cat' from `4` where `recid` = 'cneta0ld00ah')
  UNION
 (SELECT *, `5` AS 'cat' from `5` where `recid` = 'cneta0ld00ah')

所有类似于以下内容的表都被命名为 1、2、3、4 等。

 recid         | item
 -------------------------
 cneta0ld00ah  |   1
 cneta0ld00ab  |   1
 cneta0ld00ad  |   3

我无法更改表的名称,因为它是从我们试图转换和提取数据的非常旧的数据库中导入的。

如果我在没有 'table-name' AS 'cat' 的情况下运行它,那么它运行良好,一旦我尝试添加表名,它就会抛出一个错误提示

Unknown column '2' in 'field list'

似乎认为 2 是列名?

【问题讨论】:

  • 你使用UNION而不是UNION ALL有什么原因吗?
  • 呃,不,只是认为 UNION 可能是要走的路。刚刚注意到 UNION 删除了重复的行,它可能每个表都会返回一个 1 的项目,我想知道这是否只会返回 1 行。 ALL 返回所有行?还有其他使用 ALL 的理由吗?
  • UNION 需要额外的时间来删除重复项。如果您只需要合并没有重复的数据,UNION ALL 会更快,因为它不会删除重复。看我的回答。

标签: mysql select union


【解决方案1】:

问题是'table-name' AS 'cat' 周围的反引号。反引号用于引用表和列名,而不是字符串。您应该改用单引号:

 (SELECT *, '2' AS 'cat' from `2` where `recid` = 'cneta0ld00ah')
  UNION
 (SELECT *, '3' AS 'cat' from `3` where `recid` = 'cneta0ld00ah')
  UNION
 (SELECT *, '4' AS 'cat' from `4` where `recid` = 'cneta0ld00ah')
  UNION
 (SELECT *, '5' AS 'cat' from `5` where `recid` = 'cneta0ld00ah')

【讨论】:

    【解决方案2】:

    所有表都具有相同的结构吗?在Unionselect * 中,他们需要。

    如果是这样,请尝试删除括号

    SELECT recid, item, `2` AS `cat` from `2` where `recid` = 'cneta0ld00ah'
    UNION 
    SELECT recid, item, `3` AS `cat` from `3` where `recid` = 'cneta0ld00ah'
    

    【讨论】:

    • 表 2 到 5 肯定可以,后面的一些不需要,我将在以后工作,但上面的那些。
    【解决方案3】:

    使用UNION ALL 而不是UNION

    (SELECT *, `2` AS 'cat' from `2` where `recid` = 'cneta0ld00ah')
     UNION ALL
    (SELECT *, `3` AS 'cat' from `3` where `recid` = 'cneta0ld00ah')
     UNION ALL
    (SELECT *, `4` AS 'cat' from `4` where `recid` = 'cneta0ld00ah')
     UNION ALL
    (SELECT *, `5` AS 'cat' from `5` where `recid` = 'cneta0ld00ah')
    

    在选择相关信息时应使用UNION,类似于JOIN,因为只会选择不同的值。 UNION ALL 不会删除重复项,因此也减少了查找不同值所需的时间。

    您还应该始终指定一个列列表,而不是SELECT *

    【讨论】:

    • 感谢 UNION ALL 肯定会帮助解决一些问题,但正如 Ike 指出的那样,我的特殊问题已通过反引号解决。
    猜你喜欢
    • 2018-09-24
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2011-04-01
    相关资源
    最近更新 更多