子选择失败并显示“重复列名'NULL'”

时间:2016-10-28 14:26:01

标签: mysql

我从实际查询中提取了以下“完整的最小示例”:

SELECT * FROM ( SELECT 1, null, null ) AS tmp LIMIT 1

预期结果:

| 1 | NULL | NULL |

实际结果:

  

1060 - 重复列名'NULL'

我做错了什么?我是否真的必须将我的查询转换为以下非常繁琐的变体:

SELECT tmp.a, tmp.b, tmp.c FROM ( SELECT 1 a, null b, null c ) AS tmp LIMIT 1

如果是,为什么呢?通常,MySQL不会试图伤害我:o

2 个答案:

答案 0 :(得分:1)

您必须至少指定一个列别名:

SELECT * FROM (SELECT 1 AS n, null AS col1, null AS col2) AS tmp LIMIT 1

答案 1 :(得分:0)

为什么MySQL会抛出错误?在列表中,列名必须是唯一的。

在示例查询中,tmp是一个派生表,由三列组成。

如果将别名分配给SELECT列表中的表达式,MySQL将使用别名作为列名。如果没有别名,MySQL将派生一个要分配的列名。

您的查询基本上是简写:

  SELECT tmp.*
    FROM ( SELECT 1     AS `1` 
                , null  AS `NULL`
                , null  AS `NULL`
         ) tmp
   LIMIT 1

作为一种解决方法,只需为第2列或第3列分配唯一的别名。