4

我有一个查询:

 (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 的形式出现,而不管它们实际来自哪个表。

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

4

3 回答 3

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)
于 2013-02-18T07:26:12.060 回答
2

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

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

于 2013-02-18T07:22:46.397 回答
2

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

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

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

于 2013-02-18T07:23:07.177 回答