日期:2014-05-18  浏览次数:20537 次

简单语句的理解,求前辈们为小弟解答
才学SQL Server2008一个月,发现对语句的理解很不到位
[code=SQL][/code]
USE AdventureWorks2008

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;

注释WHERE语句前,得到的是每个CustomerID中最小的OrderDate
列出一小部分:
CustomerID OrderDate
11000 2001-07-22 00:00:00.000
11001 2001-07-18 00:00:00.000
11002 2001-07-10 00:00:00.000
11003 2001-07-01 00:00:00.000
11004 2001-07-26 00:00:00.000
11005 2001-07-02 00:00:00.000
11006 2001-07-27 00:00:00.000
11007 2001-07-12 00:00:00.000
11008 2001-07-28 00:00:00.000
11009 2001-07-30 00:00:00.000
注释后,得到最小Orderdate的一些CustomerID
列出一小部分:
CustomerID OrderDate
11003 2001-07-01 00:00:00.000
14501 2001-07-01 00:00:00.000
21768 2001-07-01 00:00:00.000
25863 2001-07-01 00:00:00.000
28389 2001-07-01 00:00:00.000
29489 2001-07-01 00:00:00.000
29491 2001-07-01 00:00:00.000
为什么是这结果?各位前辈们给我讲讲对语法的理解吧。。。

------解决方案--------------------
不加表示是子查询那个表本身所有数据的最小日期,加where表示对于外部每个 CustomerID 对应表本身最小的日期。

例如 子查询的表 有数据 

CustomerID orderdate
1 '2012-01-01'
1 '2012-02-02'
2 '2012-07-01'

不加 where 那么查出来的是 '2012-01-01' 只有这一个
加where条件后,对于CustomerID是1的,按'2012-01-01'取,对于CustomerID是2的,按'2012-07-01'取。