Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server tsql中的内部连接逻辑_Sql Server_Tsql_Join - Fatal编程技术网

Sql server tsql中的内部连接逻辑

Sql server tsql中的内部连接逻辑,sql-server,tsql,join,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.Order

有人能解释为什么会这样:

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;

我想我明白了。基本上,当说

选择不同的e.empid 来自人力资源部员工e 参加 选择empid,orderdate 来自销售订单 其中orderdate='20080212'作为 关于e.empid!=a、 empid


它们不产生相同结果的原因是,存在这样一种情况,即HR.Employees中的每个empid至少不等于派生表中的一个empid

我想混乱一定是因为第一个查询

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

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

以及查询

SELECT DISTINCT e.color
FROM   YourTable e
       JOIN YourTable AS a
         ON e.color != a.color; 
第一个逻辑步骤是笛卡尔连接

然后保留e.color!=a、 颜色留下六行

最后是e颜色的区别

这实际上就是您的第一个查询所做的

少量的思考表明,它将始终返回第一个表中的所有颜色,除非第二个表为空,交叉连接返回零行,或者第二个表仅包含一种颜色,而这也是第一个表中的颜色之一


您的第二个查询执行反半联接,并返回左侧所有不匹配的行(假设orderdate不可为null),其他方法可能是使用

从逻辑上讲,它们甚至不是同一件事。第一个查询对我说,给我所有不在派生表中的HR.empid。然而,它提供了HR.Employee表中每个不同的empid,甚至是派生表中存在的empida、 empid与e.empid=a.empid。如果要排除在派生表中或不在派生表中的行,则应使用EXISTS和notexists。无论何时,只要在连接或where谓词中看到一个不等式,就会进入不可争论的领域,这意味着表/索引扫描。跟索引说再见吧。你不是在看整个语句。。。。CTE生成放置在20080212上的EMPID和OrderDate的结果集。外部查询将集合与不在CTE中的表和行中的EMPID进行连接。然后WHERE过滤掉orderdate列中没有空值或未知值的行,基本上会生成所有在20080212上没有订单的EMPID…其想法是让第一个查询生成相同的EMPID。这是一个很好的解释方法。这是我在为MCSA考试70-461学习的材料中提出的一个问题。它请求将其作为联接、集合运算符和表表达式来执行。除此之外,最简单的方法是使用set运算符,我不会让自己受到惩罚:。