转:SQL 表的自连接 不等值连接--500元钱走多远?

题目内容:
一个表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语句实现

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

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.NAMESUM(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值