題目內容:
一個表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