2014-07-26 71 views
0

我是新来的,我想我会得到一些帮助。两个SQL查询中的差异,但结果相同

我有两个疑问

FIRST

SELECT ename, deptno, sal, comm 
FROM emp 
WHERE sal IN 
     (SELECT sal FROM emp WHERE deptno = 30) 
and comm IN 
(SELECT comm FROM emp WHERE deptno = 30) 

第二

SELECT ename, deptno, sal, comm 
FROM emp 
WHERE (sal, comm) IN 
(SELECT sal, comm FROM emp WHERE deptno = 30) 

它们产生相同的结果,但它们之间有什么区别???

也许SECOND会比第一个返回结果快....或???

非常感谢!

+0

你可以在这里找到一些信息http://stackoverflow.com/questions/13027708/sql-multiple-columns-in-in-in-clause – FSou1

+1

你可以让我们知道你指的是哪个数据库,SQL Server,MY SQL,Oracle? – Surendra

+0

我指的是SQL Server – Stack

回答

3

这些都不是相同的查询。他们可能碰巧会产生相同的数据,但这只是因为你的数据集没有说明差异。

正如你所看到的,这个(你的第二查询) http://sqlfiddle.com/#!4/eaf0d/2/0

是不一样的:(您的第一个查询) http://sqlfiddle.com/#!4/eaf0d/1/0

你的第一个查询将返回谁的任何雇员部门30中的任何人的薪水,以及与部门30中的任何人相同的佣金,但是每个人都可以是不同的人,即。薪水可能是一个比赛瓦特/人X和委托可能是一个匹配瓦特/人Y

您的第二个查询将返回任何雇员谁拥有相同的工资和部门30中至少有一名雇员的佣金。但不像第一个查询中,薪水和佣金都必须是部门30中同一员工的匹配项,您不能让一个人与X匹配,另一个与人Y匹配。

换句话说,您的第二个查询更具选择性。

这就是为什么'Fish'在我的示例数据集中被排除在外,他​​的薪水与'Brian'相匹配(但与Brian的佣金不匹配),并且他有一个匹配w/Doodle的委托但不是Doodle的工资)。因为根据双方的佣金和薪水,员工没有一次匹配,所以他被排除在外。

他被包含在另一个查询中,因为其中一个或另一个确实与至少一名员工匹配(但这些员工是不同的人)。

性能方面,下面的查询将导致更少的表扫描,并可以运行得更快,但如果你的意图相符根据我上面的2个查询之间的功能差异的描述,你应该只使用它:

SELECT ename, deptno, sal, comm 
FROM emp 
WHERE (sal, comm) IN 
(SELECT sal, comm FROM emp WHERE deptno = 30) 
+0

好,但让我们说我们不需要设置会给我们不同的结果,在这种情况下有什么区别? – Stack

+0

@Stack第二个可能会有更少的表扫描(你可以看看我发布的2个小提琴中的执行计划),所以这可能会表现更好,但是我只会使用那个查询,如果它实际上是你想要的(甚至尽管2个查询现在返回相同的结果,但他们未来可能不会返回相同的结果,因为添加了新数据) –

0

我想你只需要这样:

SELECT ename, deptno, sal, comm 
FROM emp 
WHERE deptno = 30 

@布赖恩DeMilia刚刚作出了一个巨大的观察为什么上面可能是错误的。您可能希望这样:

SELECT emp.ename, emp.deptno, emp.sal, emp.comm 
FROM emp 
JOIN emp AS emp2 
WHERE emp2.deptno = 30 AND emp.comm = emp2.comm AND emp.sal = emp2.sal 

这可能是最好使用HAVINGcommsal匹配。当然,你应该选择最简单的方法。取决于您的RLDBM,关键字AS可能会导致失败 - 如果是,请将其删除。

没有人可以在没有更多信息的情况下回答有关速度的问题。很难想象任何这些之间的速度差异,但很大程度上取决于记录集的大小,RDBMS(数据库程序)的选择和表索引。

+0

他很可能会查询找到与在30部门工作的员工相同的薪水或佣金的人员(但他们自己可能不在30部门中),但这不是做。 –

+0

对,并感谢。我改变了我的答案。 – Smandoli

相关问题