tsql中的内连接逻辑

时间:2015-06-29 20:52:33

标签: sql-server tsql join

有人可以解释为什么:

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;

2 个答案:

答案 0 :(得分:4)

我想混淆必须是因为第一次查询。

它执行笛卡尔连接然后返回e.empid!= a.empid的那些行,然后最终应用distinct。这几乎肯定不是你想要的语义,它们与第二个查询非常不同。

为了简化事情,我们假设您有一个简单的表格

enter image description here

和查询

SELECT DISTINCT e.color
FROM   YourTable e
       JOIN YourTable AS a
         ON e.color != a.color; 

第一(逻辑)步骤是笛卡儿联接

enter image description here

然后保留e.color != a.color(留下六行)

的所有行

enter image description here

最后选择DISTINCT

e.color

enter image description here

这实际上是您的第一个查询。

少量的想法表明它总是会从第一个表中返回所有颜色,除非第二个表为空并且交叉连接返回零行或第二个表只包含一个颜色,这也是一个第一张表中的颜色。

您的第二个查询执行反半连接并返回左侧不匹配的所有行(假设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都不会至少等于派生表中的一个。