有人可以解释为什么:
SELECT DISTINCT e.empid
FROM HR.Employees e
join (
SELECT empid,orderdate
from sales.orders
WHERE orderdate = '20080212') as a
on e.empid != a.empid;
不提供与:
相同的结果集WITH A AS(SELECT distinct empid,orderdate FROM Sales.Orders WHERE orderdate = '20080212')
SELECT distinct e.empid,a.orderdate
FROM HR.Employees e
left JOIN A AS A
on e.empid = a.empid
WHERE a.orderdate is null;
答案 0 :(得分:4)
我想混淆必须是因为第一次查询。
它执行笛卡尔连接然后返回e.empid!= a.empid的那些行,然后最终应用distinct。这几乎肯定不是你想要的语义,它们与第二个查询非常不同。
为了简化事情,我们假设您有一个简单的表格
和查询
SELECT DISTINCT e.color
FROM YourTable e
JOIN YourTable AS a
ON e.color != a.color;
第一(逻辑)步骤是笛卡儿联接
然后保留e.color != a.color
(留下六行)
最后选择DISTINCT
e.color
这实际上是您的第一个查询。
少量的想法表明它总是会从第一个表中返回所有颜色,除非第二个表为空并且交叉连接返回零行或第二个表只包含一个颜色,这也是一个第一张表中的颜色。
您的第二个查询执行反半连接并返回左侧不匹配的所有行(假设orderdate
不可为空),其他方法可能是使用EXCEPT
, NOT IN
, OUTER APPLY
or NOT EXISTS
答案 1 :(得分:-1)
想想我弄清楚了。基本上,当说
时SELECT DISTINCT e.empid 来自HR.Employees e 加入( SELECT empid,orderdate 来自sales.orders WHERE orderdate ='20080212')作为 在e.empid!= a.empid;
他们没有产生相同结果的原因是,有一种情况,HR.Employees中的每个empid都不会至少等于派生表中的一个。