SQL Server中使用临时表的一例

使用SQL Server的示例数据库AdventureWorks,如果需要知道系统中每位客户第一个订单的Sales OrderID和Order Date。即需要知道客户第一天下订单的日期和这些订单的ID。下面来逐条分析。

首先,希望知道每个结果的OrderDate、SalesOrderID和CustomerID。所有这些信息都可以在SalesOrderHeader表中找到,因此查询将基于该表,至少是部分基于该表。

然后,需要知道系统中每个客户第一天下订单的日期。如果使用两个单独的查询来完成,那也没有太多困难——只需要创建一个临时表,然后与之连接。

使用临时表的解决方案有点类似如下所示:

USE AdventureWorks ;

-- Get a list of customers and the date of their first order
SELECT soh.CustomerID, MIN(soh.OrderDate) AS OrderDate
INTO #MinOrderDates
FROM Sales.SalesOrderHeader soh
GROUP BY soh.CustomerID;

-- Do something additional with that information
SELECT soh.CustomerID, soh.SalesOrderID, soh.OrderDate
FROM Sales.SalesOrderHeader soh
	JOIN #MinOrderDates t
		ON soh.CustomerID = t.CustomerID
		AND soh.OrderDate = t.OrderDate
	ORDER BY soh.CustomerID;
	
DROP TABLE #MinOrderDates;

使用关联子查询的方法可以这样实现:

SELECT soh1.CustomerID, soh1.SalesOrderID, soh1.OrderDate
FROM Sales.SalesOrderHeader soh1
WHERE soh1.OrderDate = (SELECT MIN(soh2.OrderDate)
						FROM Sales.SalesOrderHeader soh2
						WHERE soh2.CustomerID = soh1.CustomerID )
ORDER BY CustomerID ;

Add comment

Loading