SQL 表的自連接 不等值連接


題目內容:
一個表T_20161004
ID 字段為編號,遞增不一定連續
uPrice 字段為區段路費,比如從家到哈爾濱是60元,從哈爾濱到長春是70元 數值類型
Name 字段站點名稱。
現在有500元錢, 從家先經哈爾濱出發, 能走多遠?
ID uPrice Name
1 60 哈爾濱
2 70 長春
3 80 沈陽
4 50 北京
5 90 鄭州
6 75 武漢
7 80 長沙
8 90 廣州

要求:請用一句SQL語句實現

 

CREATE TABLE T_20161004(
ID INT IDENTITY(1,1) NOT NULL,
uPrice INT,
Name VARCHAR(10)
)
INSERT INTO T_20161004 VALUES(60,'哈爾濱')
INSERT INTO T_20161004 VALUES(70,'長春')
INSERT INTO T_20161004 VALUES(80,'沈陽')
INSERT INTO T_20161004 VALUES(50,'北京')
INSERT INTO T_20161004 VALUES(90,'鄭州')
INSERT INTO T_20161004 VALUES(75,'武漢')
INSERT INTO T_20161004 VALUES(80,'長沙')
INSERT INTO T_20161004 VALUES(90,'廣州')


-- 方法一 交叉連接  不等值連接 不容易理解
SELECT TOP 1 b.id, b.NAME, SUM(a.uprice) s_sum
FROM T_20161004 a , T_20161004 b 
WHERE a.id<=b.id
GROUP BY b.id,b.name
HAVING SUM(a.uprice)<=500
ORDER BY b.id DESC

-- 方法二 自連接
SELECT TOP 1 b.id,b.NAME,SUM(a.uprice) s_sum
FROM  T_20161004 a 
INNER JOIN T_20161004 b ON a.id<=b.id  --不等值連接
GROUP  BY  b.id,b.name
HAVING SUM(a.uprice)<=500
ORDER BY b.id DESC

-- 方法三 子查詢 比較容易理解

SELECT TOP 1 ID, NAME, M_SUM
FROM (SELECT *, (SELECT SUM(uprice) from T_20161004 
		WHERE  ID <= A.ID) AS M_SUM
		FROM T_20161004 A ) B 
WHERE M_SUM<=500
ORDER BY ID DESC 

/* 子查詢步驟
1. 外部查詢獲得一條記錄並將其傳入內部查詢;
2. 基於傳入的值進行內部查詢
3. 內部查詢將自己返回的結果值傳給外部查詢,外部查詢利用這些值完成自己的處理。
*/
SELECT *, (SELECT SUM(uprice) from T_20161004 
		WHERE  ID <= A.ID) AS M_SUM
		FROM T_20161004 A 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM