T-SQL查询进阶:深入理解子查询
发布时间:2016-10-12 15:37:52 所属栏目:MsSql教程 来源:网络整理
导读:引言 SQL有着非常强大且灵活的查询方式,而多表连接操作往往也可以用子查询进行替代,本篇文章将会讲述子查询的方方面面。 简介 子查询本质上是嵌套进其他SELECT
|
如何区别相关子查询和无关子查询呢?最简单的办法就是直接看子查询本身能否执行,比如上面的例子中的子查询: (SELECT * FROM [AdventureWorks].[HumanResources].[Employee] e WHERE c.ContactID=e.ContactID AND e.SickLeaveHours>68) 这一句本身执行本身会报错.因为这句引用到了外部查询的表 对于无关子查询来说,整个查询的过程为子查询只执行一次,然后交给外部查询,比如: SELECT * FROM AdventureWorks.HumanResources.Employee WHERE SickLeaveHours>ANY SQLRESULT 上面的无关子查询,整个查询过程可以看作是子查询首先返回SQLResult(SQL结果集),然后交给外部查询使用,整个过程子查询只执行一次 而相反,作为相关子查询,子查询的执行的次数依赖于外部查询,外部查询每执行一行,子查询执行一次,比如: 还是上面的例子:我想取得总共请病假天数大于68天的员工
SELECT [FirstName]
,[MiddleName]
,[LastName]
FROM [AdventureWorks].[Person].[Contact] c
WHEREEXISTS
(SELECT *
FROM [AdventureWorks].[HumanResources].[Employee] e
WHERE c.ContactID=e.ContactID AND e.SickLeaveHours>68)
----
step 1:
SELECT [FirstName]
,[MiddleName]
,[LastName]
FROM [AdventureWorks].[Person].[Contact] c
WHEREEXISTS
(SELECT *
FROM [AdventureWorks].[HumanResources].[Employee] e
WHERE 1=e.ContactID AND e.SickLeaveHours>68)
----
step 2:
SELECT [FirstName]
,[MiddleName]
,[LastName]
FROM [AdventureWorks].[Person].[Contact] c
WHEREEXISTS
(SELECT *
FROM [AdventureWorks].[HumanResources].[Employee] e
WHERE 2=e.ContactID AND e.SickLeaveHours>68)
----
step n:
SELECT [FirstName]
,[MiddleName]
,[LastName]
FROM [AdventureWorks].[Person].[Contact] c
WHEREEXISTS
(SELECT *
FROM [AdventureWorks].[HumanResources].[Employee] e
WHERE n=e.ContactID AND e.SickLeaveHours>68)
如上面代码所示。上面的相关子查询实际上会执行N次(N取决与外部查询的行数),外部查询每执行一行,都会将对应行所用的参数传到子查询中,如果子查询有对应值,则返回TRUE(既当前行被选中并在结果中显示),如果没有,则返回FALSE。然后重复执行下一行。 (编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

