2016-12-11 93 views
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输出)

+0

你实际使用哪个数据库?我猜测甲骨文,我也​​猜测这是一个家庭作业问题。 –

+0

是的,Oracle数据库。 我试图找出为什么0输出一个不起作用。 (我自己写的)。 问题的解决方案是具有36个输出的解决方案。 我不知道为什么我的SQL类型不正确,看起来对我很正确,但显然不是基于结果。 –

+0

添加一些示例表格数据和当前的两个结果。 (以及格式化文本。)同时向我们显示想要的结果。 – jarlh

回答

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

你不能改变什么实质性的,如果你会外where子句中前进location_id这一条件。现在很明显,这个查询不包括任何不在地点1700的员工 - 对于其他查询,这不总是正确的。

此外,这一个不具有NVL函数应用于commission_pct,这意味着员工将也被排除在外,如果他们有null作为commission_pct。这是因为NULL IN (SELECT ...)总是评估为false。

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

+0

谢谢先生,有没有更简单的方法来使用我的方法重写查询?可以使用JOIN? 而且我不太了解“你不会改变任何实质性的,如果你将这个条件移动到外部where子句中的location_id上”意思是...... –

+0

对不起,我认为你的问题是*“两个SQL之间有什么区别以及为什么他们没有现在你要求重写查询吗?如果这是你的问题,请发布一个新问题(没问题)。我对'location_id'条件的评论意味着这个条件不涉及任何子查询,所以很具误导性。这是外部查询条件,所以应该放在那里。我说这样的举动不会改变结果。但它更好地说明会发生什么。 – trincot

相关问题