如果我有这样的查询:
SELECT
A.ID,
A.Name,
A.Type,
B.FirstName,
B.LastName,
B.DateOfBirth,
C.OfficeName
FROM A
INNER JOIN B ON A.ContactID = B.ID
INNER JOIN C ON B.OfficeID = C.ID
WHERE
A.Type = 1
何时应用A.Type = 1过滤器?是在连接之后,还是查询查找'A',确定它是否通过过滤器,然后只加入B和C(如果有)?
希望这是有道理的。感谢。
答案 0 :(得分:12)
首先,下面是SQL操作顺序:
在简单查询中,过滤发生在FROM
子句之后(在此部分找到连接)。你上面所做的是它主要是将表连接到定义它们之间关系的链接列。设置记录后(连接结果),然后会发生WHERE
子句以过滤掉Type
,其中is等于1.
以下是使用LEFT JOIN
,
第一次查询:
SELECT A.ID,
A.Name,
A.Type,
B.FirstName,
B.LastName,
B.DateOfBirth
FROM A
LEFT JOIN B
ON A.ContactID = B.ID AND
B.LastName = 'Michaels'
vs Second Query:
SELECT A.ID,
A.Name,
A.Type,
B.FirstName,
B.LastName,
B.DateOfBirth
FROM A
LEFT JOIN B ON A.ContactID = B.ID
WHERE B.LastName = 'Michaels'
第一个查询返回表A
中的所有记录。 B.LastName = 'Michaels'
在表B
加入表A
之前所做的事情是,它会过滤掉LastName
等于Michaels
的所有记录。因此,表A
中没有匹配表B
上的筛选记录的记录将在表B
的列上具有 NULL 值。
第二个查询不会与第一个查询产生相同的结果,并且与INNER JOIN
执行完全相同,因为在记录加入后,将对结果执行另一个过滤,并仅记录{ {1}}等于 Michaels 。
答案 1 :(得分:6)
逻辑上 - 在join
之后,物理上 - 它取决于优化器。
答案 2 :(得分:4)
每MSDN。
检查标题为 SELECT语句的逻辑处理顺序
- FROM
- ON
- 加入
- WHERE
- GROUP BY
- WITH CUBE或WITH ROLLUP
- HAVING
- 选择
- DISTINCT
- ORDER BY
- TOP
醇>
在此列表前面的段落末尾有一个重要的注释。
请注意,语句的实际物理执行由查询处理器决定,订单可能与此列表不同。
答案 3 :(得分:2)
要回答这个问题,您真的需要查看执行计划。在你提到的情况下,你在where子句中有一个可搜索的参数(SARG),过滤器最有可能在你加入之前应用你的访问方法,即索引,表扫描等。
使用
查询菜单 - >包括实际执行计划
或
查询菜单 - >显示预计执行计划
看看。
答案 4 :(得分:1)
在连接之前将应用Where子句,即它将返回A的所有行,B和C中的相应行取决于连接条件和type = 1