子查询中的MySQL未知列

时间:2018-11-28 06:28:24

标签: mysql sql subquery

共有三个表-mapping_hospital_proceduremaster_hospitalmaster_procedure

master_hospital包含一个id列以标识每家医院。

master_procedure还包含一个id列,用于相同的目的,即标识每个过程。

mapping_hospital_procedure用于将医院映射到医疗程序,除其他列外,还包含列hid(医院ID)和pid(过程ID)。现在,如果我运行此查询:

SELECT hid FROM master_procedure

它不起作用,因为hid中没有master_procedure列。但是,如果我将此查询放在子查询中,则效果很好。像这样-

SELECT hid FROM mapping_hospital_procedure WHERE pid = (SELECT hid FROM master_procedure)

但是它不起作用,因为hid中没有名为master_procedure的列。它应该提供与上一个查询相同的“未知列”错误。谁能解释为什么或如何运作?

谢谢。

2 个答案:

答案 0 :(得分:3)

范围问题。您的子查询有权访问主查询的列。

由于在子查询表中没有找到hid,它将退出并在主查询中寻找它-在mapping_hospital_procedure表中可以找到它。

SELECT hid FROM mapping_hospital_procedure
WHERE pid = (SELECT hid FROM master_procedure)

相同
SELECT mhp.hid FROM mapping_hospital_procedure mhp
WHERE mhp.pid = (SELECT mhp.hid FROM master_procedure mp)

现在的经验教训:始终限制您的专栏!

编辑:“ 这至少应该是一个逻辑错误,给出错误的输出,对吗?

是的,该查询没有多大意义。

如果master_procedure表根本不包含任何行,则mhp.pid = (SELECT mhp.hid FROM master_procedure mp)将为false。完全不返回任何行。

如果master_procedure表包含2行或更多行,则应引发“ 子查询返回多于1行”的异常。 (因为这是=的比较。请使用IN来避免此问题。)

如果master_procedure表恰好包含1行,则如果mhp.pid不为null,则mhp.pid = (SELECT mhp.hid FROM master_procedure mp)条件的值为 true ,并且该行从mapping_hospital_procedure返回。如果mhp.pid为null,则不返回该行。


您真正想做的可能是:

SELECT mhp.hid FROM mapping_hospital_procedure mhp
WHERE mhp.pid IN (SELECT mp.id FROM master_procedure mp)

答案 1 :(得分:1)

使用该查询,您实际上是在进行自然联接。 https://www.w3resource.com/sql/joins/natural-join.php

数据库解析器足够聪明,可以将查询转换为联接。 您的查询:

async/await

与以下基本相同:

SELECT hid FROM mapping_hospital_procedure 
WHERE pid = (SELECT hid FROM master_procedure)