使用以下问题,您可以向我解释两个SQL之间有什么区别,为什么它们没有相同的结果?
显示薪水和佣金与位置ID1700的任何雇员的薪水和佣金的任何雇员的姓氏,部门名称和工资。
SELECT E.LAST_NAME, D.DEPARTMENT_NAME, E.SALARY
FROM EMPLOYEES E
JOIN DEPARTMENTS D
ON (E.DEPARTMENT_ID =D.DEPARTMENT_ID)
WHERE E.SALARY IN (SELECT SALARY
FROM EMPLOYEES
WHERE D.LOCATION_ID = 1700) AND
E.COMMISSION_PCT IN (SELECT COMMISSION_PCT
FROM EMPLOYEES
WHERE D.LOCATION_ID = 1700);
(0输出)
和
SELECT e.last_name, d.department_name, e.salary
FROM employees e,
departments d
WHERE e.department_id = d.department_id AND
(salary, NVL(commission_pct,0)) IN (SELECT salary,
NVL(commission_pct,0)
FROM employees e,
departments d
WHERE e.department_id = d.department_id AND
d.location_id = 1700);
(36个输出)
请注意,此查询:
SELECT e.last_name, d.department_name, e.salary
FROM employees e,
departments d
WHERE e.department_id = d.department_id AND
(salary, NVL(commission_pct,0)) IN (SELECT salary,
NVL(commission_pct,0)
FROM employees e,
departments d
WHERE e.department_id = d.department_id AND
d.location_id = 1700);
...将包括任何与位置1700相同的工资和佣金的员工。但是,如果只有1700的地点的工资和佣金完全相同的人,其他员工也不在该位置。因此,此查询正确回答给定的作业。
但是,另一个查询在两个子查询中都有一个奇怪的条件,因为它在外部查询上应用了条件(唯一定义了D
的地方) - 不是sub查询 - 并且确实两次(这无济于事):
SELECT E.LAST_NAME, D.DEPARTMENT_NAME, E.SALARY
FROM EMPLOYEES E
JOIN DEPARTMENTS D
ON (E.DEPARTMENT_ID =D.DEPARTMENT_ID)
WHERE E.SALARY IN (SELECT SALARY
FROM EMPLOYEES
WHERE D.LOCATION_ID = 1700) AND
E.COMMISSION_PCT IN (SELECT COMMISSION_PCT
FROM EMPLOYEES
WHERE D.LOCATION_ID = 1700);
,如果您在外部where
子句中的location_id
上移动该条件,则不会更改任何实质性。现在很明显,此查询不包括任何不在位置1700的员工 - 对于其他查询并不总是正确的。
此外,此功能没有应用于commission_pct
的NVL
函数,这意味着如果员工将null
作为commission_pct
,也将被排除在外。这是因为NULL IN (SELECT ...)
总是评估为false。
因此,此查询可以返回更少的记录的原因有两个,也有两个原因,为什么它是您获得的作业的错误答案。