这个SQL语句是否有效,或者MySQL报告错误是否正确?
我有一个带有子查询的查询,其中子查询在MySQL中正确运行,但整个查询会产生一个错误。我将这个问题提炼成一个简单的可复制问题: 这是在MySQL这个SQL语句是否有效,或者MySQL报告错误是否正确?,mysql,sql,database,join,rdbms,Mysql,Sql,Database,Join,Rdbms,我有一个带有子查询的查询,其中子查询在MySQL中正确运行,但整个查询会产生一个错误。我将这个问题提炼成一个简单的可复制问题: 这是在MySQLerror 1060(42S21)中产生错误的查询:重复的列名“id” SELECT a.* FROM ( SELECT * FROM locations l RIGHT JOIN total_cases c ON l.id=c.loc_id) a; 只运行子查询 SELECT * FROM loca
error 1060(42S21)中产生错误的查询:重复的列名“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 |
...
我从关系数据库管理系统的角度感兴趣。重复的id
列是否作为联接的结果有效,但在SELECT
语句的列列表中无效?如果有人也能提供标准参考,我将不胜感激
编辑:关于如何重建查询的否决票和答案表明我的问题不清楚。我想从RDBMS的角度理解正确的行为是什么,以及子查询和外部查询中重复列之间的区别。这是一个数据库问题,而不是“如何编写我的sql”问题。谢谢 子查询返回两个名称完全相同的列,
id
。当您试图从中选择作为子查询时,它不知道需要引用哪个id。您需要在子查询中声明列名,并确保没有重复的列名。
派生表是在查询FROM子句范围内生成表的表达式。例如,SELECT语句FROM子句中的子查询是派生表
然后它说
派生表中的任何列都必须具有唯一的名称id在两个表中,因此您现在可以决定 如果需要所有列
SELECT a.* FROM (
SELECT l.*,c.* FROM locations l
RIGHT JOIN total_cases c
ON l.id=c.loc_id) a;
或者如果你不想从bith表中复制
SELECT a.* FROM (
SELECT l.location ,c.* FROM locations l
RIGHT JOIN total_cases c
ON l.id=c.loc_id) a;
Mysql无法为你决定你想要什么和需要什么,所以你必须告诉他
子查询单独使用SELECT*作为结果集,但当您尝试使用is作为OUT查询的基础时,它会变成一个临时表,其中有某些规则,其中一个规则是每列都必须有自己的名称,要正确识别,请在内部查询中使用别名,这样在外部查询中就不会有两个同名的列 内部查询是宽松的,它假定您正在进行测试 外部查询执行内部查询。在执行时,它会发现两列具有相同的
column\u名称
让我举例说明
假设你有一所学校,学校有两间教室
同名的。如4A类
和4A类
。这不是一个问题
到那一点为止都是个问题。当您要发送邮件时,会出现问题
学生去参观4A班。这个学生将带着一本书回来
一个错误。“先生,你说的是哪个4A班?”
构建和标记类没有问题,但在执行问题时
作为连接号的结果,重复的id列是否有效。MySQL扩展在输出列表中允许这种情况(含糊不清是客户端的问题,需要通过POSESION索引引用这些列)。但是子查询输出中的这种模糊性是MySQL的问题,因为MySQL没有posession引用,所以它会产生一个错误。是的,大多数RDBMS会产生类似的错误,因为列名不明显。例如,MS SQL Server提供“错误为'a'多次指定了列'Id'。这是否回答了您的问题?”@Akina是一个MySQL扩展。好的,那么子查询在标准一致性数据库中也应该出错?那么子查询在标准一致性数据库中也应该出错?谢谢,但问题是关于子查询中重复列的有效性。实际上,这确实回答了有效性问题。它在一个查询中有效,因为它只是输出所有列,但在嵌套查询中,它输出到另一个需要唯一列名的查询。谢谢,但问题是关于子查询中重复列的有效性。我更新了我的答案这是正确的答案。我们都知道有一个重复的列。这说明了为什么它在一个上下文中有效,而在另一个上下文中无效。这是正确的,但您没有解释为什么一个上下文有效,而子查询无效。你可以更清楚一点,当然。让我再加些肉
SELECT a.* FROM ( SELECT
l.id as location_id,
l.location,
c.id as case_id,
c.loc_id,
c.date,
c.total_cases FROM locations l
RIGHT JOIN total_cases c
ON l.id=c.loc_id) a;