Получение ошибки с использованием оператора EXISTS, но правильный результат с оператором IN в

avatar
shashikant dev
9 августа 2021 в 00:51
42
3
0

enter image description hereЯ получаю сообщение об ошибке An expression of non-Boolean type specified in a context where a condition is expected при использовании EXISTS Но когда я использую оператор IN, он дает правильный результат.<5171834>

Ниже введите описание изображенияоба запроса

SELECT * FROM emp
WHERE Emp_id IN (SELECT Emp_id FROM Department WHERE Department.Emp_id=emp.Emp_id)

SELECT * FROM emp Department
WHERE emp.Emp_id EXISTS (SELECT Emp_id FROM Department WHERE emp.Emp_id=Department.Emp_id)

Источник
ysth
9 августа 2021 в 01:05
0

вы не показываете почему вы пытаетесь привлечь Департамент к своему запросу; можете ли вы объяснить, чего вы на самом деле пытаетесь достичь?

Ответы (3)

avatar
ysth
9 августа 2021 в 00:59
2

EXISTS — это унарный оператор, а не бинарный, и в качестве аргумента он принимает только подзапрос. Вы говорите:

WHERE EXISTS (subquery...)

не

WHERE somefield EXISTS (subquery...)

Поскольку EXISTS просто проверяет, вернет ли подзапрос хотя бы одну строку, выбранные поля не имеют значения, и люди обычно это делают:

EXISTS (SELECT 1 FROM ...)

хотя выбор нуля или любого другого значения или нескольких значений работает точно так же.

avatar
shashikant dev
9 августа 2021 в 01:46
0

Я нашел решение.

Теперь я знаю, что ключевое слово EXISTS, в отличие от IN, не сравнивает, а проверяет, найден ли какой-либо результат.

Теперь я могу получить тот же результат, используя NESTED SUBQUERY, CORRELATED SUBQUERY и JOIN всех сотрудников, работающих в любом отделе, используяenter image description here Ниже приведен запрос.

SELECT * FROM emp
WHERE Emp_id IN (SELECT Emp_id FROM Department)

SELECT * FROM emp
WHERE EXISTS (SELECT Emp_id FROM Department WHERE emp.Emp_id=Department.Emp_id)

SELECT e.Emp_id, e.E_Name, e.Salary, e.E_Address FROM emp e RIGHT JOIN Department d ON e.Emp_id=d.Emp_id
avatar
Farhad Rad
9 августа 2021 в 01:05
1
Оператор

EXISTS только проверяет, найден ли какой-либо результат или нет. Он не может связывать и сравнивать найденные результаты с заданным именем столбца, поэтому его нельзя использовать с этим синтаксисом.