0

您能否使用以下问题向我解释这两个 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 个输出)

4

1 回答 1

2

请注意,此查询:

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 中的所有员工都将包含在结果集中。但也可以找到不在该位置的其他员工,只要位置 1700 中有人具有完全相同的薪水和佣金。因此,此查询正确回答给定的分配。

但是,另一个查询在两个子查询中都有一个奇怪的条件,因为它在外部查询(定义的唯一位置D)上应用了一个条件 - 而不是子查询 - 它这样做了两次(这没有帮助):

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);

location_id如果您在外部where子句中移动该条件,您将不会更改任何实质性内容。现在很明显,此查询排除了不在位置 1700 的任何员工——对于其他查询,情况并非总是如此。

此外,这个没有NVL应用于的功能,这意味着如果员工有as commission_pct,也会被排除在外。这是因为总是评估为假。nullcommission_pctNULL IN (SELECT ...)

所以这个查询可以返回更少的记录有两个原因,以及为什么它是你得到的作业的错误答案。

于 2016-12-11T10:11:54.160 回答