gpt4 book ai didi

子查询中的 Mysql 未知列有效

转载 作者:行者123 更新时间:2023-11-29 01:35:04 26 4
gpt4 key购买 nike

共有三个表 - mapping_hospital_proceduremaster_hospitalmaster_procedure

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

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

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

从 master_procedure 中选择 hid

它没有像您预期的那样工作,因为 master_procedure 中没有 hid 列。但是如果我把这个查询放在一个子查询中,它就可以正常工作。像这样,例如 -

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

但它不应该工作,因为 master_procedure 中没有名为 hid 的列。它应该给出与前一个查询相同的未知列错误。任何人都可以解释为什么或如何工作吗?

谢谢。

最佳答案

范围问题。您的子查询可以访问主查询的列。

由于在子查询表中找不到 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 = (SELECT mhp.hid FROM master_procedure mp) 条件评估为 true 如果 mhp.pid 不是null,并且该行从 mapping_hospital_procedure 返回。如果 mhp.pid 为空,则不返回该行。


你真正想做的可能是:

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

关于子查询中的 Mysql 未知列有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53513386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com