共有三个表-mapping_hospital_procedure
,master_hospital
和master_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
的列。它应该提供与上一个查询相同的“未知列”错误。谁能解释为什么或如何运作?
谢谢。
答案 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)