【发布时间】:2021-08-07 02:47:05
【问题描述】:
我有一个带有子查询的查询,其中子查询单独在 MySQL 中正确运行,但整个查询会产生错误。我已经将问题提炼成一个简单的可重现的:
这是在 MySQL ERROR 1060 (42S21): Duplicate column name 'id' 中产生错误的查询
SELECT a.* FROM (
SELECT * FROM locations l
RIGHT JOIN total_cases c
ON l.id=c.loc_id) a;
只运行子查询,
SELECT * FROM locations l
RIGHT JOIN total_cases c
ON l.id=c.loc_id;
产生结果
+------+----------------+------+--------+------------+-------------+
| id | location | id | loc_id | date | total_cases |
+------+----------------+------+--------+------------+-------------+
| 237 | United Kingdom | 1 | 237 | 2020-05-09 | 203171 |
| 237 | United Kingdom | 2 | 237 | 2020-05-10 | 206234 |
| 237 | United Kingdom | 3 | 237 | 2020-05-11 | 208391 |
...
我从 RDBMS 的角度感兴趣。重复的 id 列是否作为连接的结果有效,但在 SELECT 语句的列列表中无效?如果有人也可以提供标准参考,我将不胜感激。
编辑:关于如何重建查询的投票和答案表明我的问题不清楚。我想了解从 RDBMS 的角度什么是正确的行为,以及子查询和外部查询中重复列之间的区别。这是一个数据库问题,而不是“如何编写我的 sql”问题。谢谢!
【问题讨论】:
-
作为连接结果的重复 id 列是否有效 否。MySQL 扩展允许在输出列表中这样做(歧义是客户端的问题,需要通过它们的引用来引用这些列占有指数)。但是子查询输出中的这种歧义是 MySQL 问题,它没有拥有引用 - 所以它会产生错误。
-
是的,大多数 RDBMS 都会产生类似的错误,因为列名不明确。例如,MS SQL Server 给出“错误列 'Id' 为 'a' 指定了多次。
-
@Akina MySQL 扩展。好的,那么子查询应该在符合标准的数据库中也会出错吗?
-
所以子查询在符合标准的数据库中也应该出错?是的
标签: mysql sql database join rdbms