Mysql неизвестный столбец в подзапрос работает - PullRequest
0 голосов
/ 28 ноября 2018

Существует три таблицы - mapping_hospital_procedure, master_hospital и master_procedure.

master_hospital содержит столбец id для идентификации каждой больницы.

master_procedure такжесодержит столбец id для той же цели, т. е. для идентификации каждой процедуры.

mapping_hospital_procedure используется для сопоставления больниц с медицинскими процедурами и содержит столбцы hid (идентификатор больницы) и pid (идентификатор процедуры) помимо других столбцов.Теперь, если я выполню этот запрос:

SELECT hid FROM master_procedure

, он не будет работать так, как вы, потому что в master_procedure нет столбца hid.Но если я помещу этот запрос в подзапрос, он работает нормально.Подобным образом, например, -

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

Но это не должно работать, поскольку в master_procedure нет столбца с именем hid.Он должен выдавать ту же ошибку неизвестного столбца, как и в предыдущем запросе.Кто-нибудь может объяснить, почему или как это работает?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Сфера вопроса.Ваш подзапрос имеет доступ к столбцам основного запроса.

Поскольку 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)
0 голосов
/ 28 ноября 2018

С этим запросом вы фактически делаете естественное соединение.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...