使用UNION ALL查询多个表时,AS关键字仅适用于第一个表

时间:2013-02-18 07:21:22

标签: mysql sql

我有一个问题:

 (SELECT col1 AS table1 FROM table1 WHERE col3 IS NOT NULL)
    UNION ALL
    (SELECT col1 AS table2 FROM table2 WHERE  col3 IS NOT NULL)
    UNION ALL
    (SELECT col1 AS table3 FROM table3 WHERE col3 IS NOT NULL)

然而,当我使用PDO和fetchAll(PDO::FETCH_ASSOC);命令处理它时,生成的数组的所有键都以table1的形式出现,而不管它们实际来自哪个表。

我的语法不正确吗?谢谢!

3 个答案:

答案 0 :(得分:7)

您的查询会返回单个列。单个列只能有一个名称/别名。在UNION查询中,第一个子查询定义结果集的列名。

如果要指定每个值来自哪个表,请添加其他列,例如像这样:

(SELECT col1, 'table1' AS src FROM table1 WHERE col3 IS NOT NULL)
UNION ALL
(SELECT col1, 'table2'        FROM table2 WHERE col3 IS NOT NULL)
UNION ALL
(SELECT col1, 'table3'        FROM table3 WHERE col3 IS NOT NULL)

答案 1 :(得分:2)

这是SQL规范:结果集的列名取自第一个选择 这就是它的方式。

当你考虑它时,在后续选择中使用不同的列名是没有意义的,因为列名不能在结果集的中途改变 - 为(整个)结果集定义列名(一次)。

答案 2 :(得分:2)

是的,这就是它的工作方式,联合值将具有第一个查询中列的别名。引自UNION文档页面:

  

第一个SELECT语句中的列名用作   返回结果的列名。

如果您不需要,请为该列提供您想要的别名。