子查询分为独立子查询和相关子查询
什么时候该利用子查询,我们可以先来看下面几个实际的例子。
我们以Northwind数据库为例
1. 返回在每月最后实际订单日期发生的订单(独立子查询)
思路:由于每个月最后实际订单最后一天是唯一的,所以我们
可以利用内层查询分组来实现。
SELECT OrderID, CustomerID, EmployeeID, OrderDate, RequiredDate
FROM dbo.Orders
WHERE OrderDate IN
(SELECT MAX(OrderDate)
FROM dbo.Orders
GROUP BY EmployeeID)
FROM dbo.Orders
WHERE OrderDate IN
(SELECT MAX(OrderDate)
FROM dbo.Orders
GROUP BY EmployeeID)
2. 为每个员工返回具有最大OrderDate的订单(相关子查询)
思路:这个问题不能再采用上面相同的策略了,因为几个员工可能会具有相同的订单日期,所以Max(OrderDate)
可能返回员工A的,也可能是员工B的。
那么,如何才能让最大订单日期定位到某个员工呢?
这个时候,我们必须利用到相关子查询,唯一的办法就是将内部查询的EmployeeID与
外部查询的EmployeeID匹配。
SELECT OrderID, CustomerID, EmployeeID, OrderDate, RequiredDate
FROM dbo.Orders AS O1
WHERE OrderDate =
(SELECT MAX(OrderDate)
FROM dbo.Orders AS O2
WHERE O2.EmployeeID = O1.EmployeeID)
FROM dbo.Orders AS O1
WHERE OrderDate =
(SELECT MAX(OrderDate)
FROM dbo.Orders AS O2
WHERE O2.EmployeeID = O1.EmployeeID)