第一種:派生表
(就是子查詢感覺變成一個表)從這個表from或者join
但是需要特別注意,派生表的orderby一點作用都沒有,不能用!!!
第二特別注意:
使用派生表的一個最常見情景就是,selelct子句處理之前的查詢語句中無法引用select子句分配的列別名,因爲selelct執行在他們之後
情景3:多個嵌套引用
---------------------------爲了表達方便,可以用with+表名+As的形式
# 1-1.
SELECT empid,Max(orderdate) AS maxorderdate
FROM Sales.Orders
GROUP BY empid;
#1-2.
SELECT so2.empid,so2.orderdate,so2.orderid,so2.custid
FROM Sales.Orders AS so2
JOIN (
SELECT empid,Max(orderdate) AS maxorderdate
FROM Sales.Orders
GROUP BY empid)AS so1
ON so2.empid = so1.empid
AND so2.orderdate = so1.maxorderdate;
-- 特別注意:爲什麼第二題不像第一題那樣直接一個呢?alter
-- 因爲groupby的特性,你在select裏面不能出現多於的列
#2-1
SELECT orderid,orderdate,custid,empid,
ROW_NUMBER() OVER(ORDER BY orderdate,orderid) AS rownum
FROM Sales.Orders;
#2-2
SELECT so.orderid,so.orderdate,so.custid,so.empid,so.rownum
FROM (
SELECT orderid,orderdate,custid,empid,
ROW_NUMBER() OVER(ORDER BY orderdate,orderid) AS rownum
FROM Sales.Orders
) AS so
WHERE so.rownum BETWEEN 11 AND 20;
-- 特別注意,爲什麼我不這樣呢
SELECT orderid,orderdate,custid,empid,
ROW_NUMBER() OVER(ORDER BY orderdate,orderid) AS rownum
FROM Sales.Orders
WHERE so.rownum BETWEEN 11 AND 20;
-- 因爲select執行順序在where之後,所有where裏面的rownum無法執行
#3.遞歸
WITH EmpsCTE AS
(
SELECT empid,mgrid,firstname,lastname
FROM HR.Employees
WHERE empid = 9
UNION ALL
SELECT P.empid,P.mgrid,P.firstname,P.lastname
FROM EmpsCTE AS C
JOIN HR.Employees AS P
ON C.mgrid = P.empid
)
SELECT empid,mgrid,firstname,lastname
FROM EmpsCTE
#4.1
SELECT so.empid,YEAR(sod.orderdate),SUM(sod.qty) AS qty
FROM Sales.Orders
JOIN Sales.OrderDetails
ON so.orderid = sod.orderid
GROUP BY empid,YEAR(sod.orderdate);
#4.2
SELECT sv.empid,sv.orderyear,sv.qty,
SELECT SUM(qty)
FROM Sales.VempOrders AS sv2
WHERE sv1.empid = sv2.empid
AND sv2.orderyear <= sv1.orderyear)AS runqty
FROM Sales.VemOrders AS sv
ORDER BY sv1.empid,sv1.orderyear;
GROUP BY empid,YEAR(sv.orderdate)
重點1-2,2-2,3-2,4-2