Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个SQL语句是否有效,或者MySQL报告错误是否正确?_Mysql_Sql_Database_Join_Rdbms - Fatal编程技术网

这个SQL语句是否有效,或者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

我有一个带有子查询的查询,其中子查询在MySQL中正确运行,但整个查询会产生一个错误。我将这个问题提炼成一个简单的可复制问题:

这是在MySQL
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;