为什么一个查询比其他查询更多



使用以下问题,您可以向我解释两个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_pctNVL函数,这意味着如果员工将null作为commission_pct,也将被排除在外。这是因为NULL IN (SELECT ...) 总是评估为false。

因此,此查询可以返回更少的记录的原因有两个,也有两个原因,为什么它是您获得的作业的错误答案。

相关内容

  • 没有找到相关文章

最新更新