作为参考,我正在尝试回答一个SQL问题:https://www.w3resource.com/sql-exercises/sql-subqueries-exercise-21.php
答案是:
SELECT first_name, last_name, department_id
FROM employees
WHERE EXISTS (SELECT *
FROM employees
WHERE salary > 3700);但是有没有人能解释一下为什么上面的结果没有返回相同的结果:
SELECT e1.first_name, e1.last_name, e1.department_id
FROM employees AS e1
WHERE e1.employee_id IN (SELECT e2.employee_id
FROM employees AS e2
WHERE e2.salary > 3700);发布于 2018-11-26 10:59:51
EXISTS子句提供的值为TRUE或FALSE。如果employees中有任何工资超过3700的行,那么您编写的语句将给出值TRUE。您没有包含任何要求该行与您正在检查的员工的id匹配的条件。
如果你想添加这样一个条件,你可以这样写(假设存在一个唯一的雇员id,名为employee_id):
SELECT first_name, last_name, department_id
FROM employees E1
WHERE EXISTS
(SELECT *
FROM employees
WHERE salary > 3700 AND employee_id = E1.employee_id )发布于 2018-11-26 10:51:58
第一个没有相关子句。因此,它要么返回employees中的所有行(如果存在匹配条件的行)。或者在employees中不返回任何行(如果不存在这样的行)。
第二种方法是将子查询中的行与外部查询中的id进行比较。使用exists的等效查询为:
SELECT e1.first_name, e1.last_name, e1.department_id
FROM employees AS e1
WHERE EXISTS (SELECT e2.employee_id
FROM employees AS e2
WHERE e2.employee_id = e1.employee_id AND
e2.salary > 3700
);当然,我们可能希望employee_id是一个名为employees的表的主键,所以这也是同样的事情:
SELECT e1.first_name, e1.last_name, e1.department_id
FROM employees AS e1
WHERE e1.salary > 3700https://stackoverflow.com/questions/53474186
复制相似问题