[英]Mysql unknown column in subquery works
共有三個表 - 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
它不像您期望的那樣工作,因為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.