Сфера вопроса.Ваш подзапрос имеет доступ к столбцам основного запроса.
Поскольку 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 = (SELECT mhp.hid FROM master_procedure mp)
оценивается как true , если mhp.pid не является нулевым, и строка возвращается из 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)