通常情况下,都会遇到取最值的情况,T-SQL提供了多种方式实现最值比较,简单罗列几种。
1. NOT EXISTS
USE [AdventureWorks2012];
GO
DBCC FREEPROCCACHE;
GO
SET STATISTICS PROFILE ON;
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT DISTINCT
[SOD].[SalesOrderID]
, [SOD].[LineTotal]
FROM [Sales].[SalesOrderDetail] [SOD]
WHERE NOT EXISTS ( SELECT 1
FROM [Sales].[SalesOrderDetail] [SD]
WHERE [SD].[SalesOrderID] = [SOD].[SalesOrderID]
AND [SD].[LineTotal] < [SOD].[LineTotal]
);
SET STATISTICS PROFILE OFF;
SET STATISTICS IO OFF;
SET STATISTICS TIME OFF;
/*
Table 'Worktable'. Scan count 21209, logical reads 529079, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderDetail'. Scan count 2, logical reads 2492, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times: CPU time = 1950 ms, elapsed time = 2168 ms.
SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times: CPU time = 0 ms, elapsed time = 0 ms.
*/
其执行计划如下图所示: