SQL練習--某書第四章 表表達式

第一種:派生表

 (就是子查詢感覺變成一個表)從這個表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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章