簡體   English   中英

子查詢中的 Mysql 未知列有效

[英]Mysql unknown column in subquery works

共有三個表 - mapping_hospital_proceduremaster_hospitalmaster_procedure

master_hospital包含一個id列來標識每家醫院。

master_procedure還包含一個用於相同目的的id列,即標識每個過程。

mapping_hospital_procedure用於將醫院映射到醫療程序,除其他列外還包含hid (醫院 id)和pid (程序 id)列。 現在,如果我運行這個查詢:

SELECT hid FROM master_procedure

它不像您期望的那樣工作,因為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)將為假。 根本不返回任何行。

如果 master_procedure 表包含 2 行或更多行,則應引發“子查詢返回多於 1 行”異常。 (因為它是一個=比較。使用IN來避免這個問題。)

如果 master_procedure 表正好包含 1 行,如果 mhp.pid 不為空,則mhp.pid = (SELECT mhp.hid FROM master_procedure mp)條件評估為,並且該行從 mapping_hospital_procedure 返回。 如果 mhp.pid 為空,則不返回該行。


你真正想做的可能是:

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

通過該查詢,您實際上是在進行自然連接。 https://www.w3resource.com/sql/joins/natural-join.php

數據庫解析器足夠智能,可以將您的查詢轉換為連接。 您的查詢:

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

與以下基本相同:

SELECT hid FROM mapping_hospital_procedure 
NATURAL JOIN master_procedure 
WHERE pid = hid

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM