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

  

时间: 2024-12-19 02:45:36

SQL 表的自连接 不等值连接的相关文章

sql表连接left join,right join,inner join三者之间的区别

sql表连接left join,right join,inner join区别 left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录 (以左表数据为基准,不足补为NULL)right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录(以右表数据为基准,不足补为NULL)inner join(等值连接) 只返回两个表中联结字段相等的行(条件on之相等的数据) 举例如下: ---------------------------------------

【Stackoverflow好问题】SQL表名,应该用复数还是单数

问题 SQL表名,应该用表对应资源对象的复数形式还是单数形式.例如一个用户表,表名是用user还是users更合适呢? 精华回答 用单数形式更佳,理由如下: 1.概念直观. 你有一个袋子,里面有好多个苹果,你会说这是个苹果袋.但无论里面有0,1,百万个苹果,它依然是个袋子.表也是如此,表明需要描述清楚,表里面包含的对象,而非有多少个数据. 2.便利性 单数形式更简单.有一些单词,它的复数形式可能是非常规的,或者就没有复数形式,但是单数不一样,单数形式则没那么多讲究.有些单词的复数,可能会想到你头

SQL表连接

背景 在上次的自考科目<数据库系统原理>中,已经接触到了关于数据库表连接的一些知识,最近的学习过程中又用到了关于数据库表的连接问题,趁此再跟大家一起回顾一下. 导图总结 首先用一张思维导图概括一下SQL表连接的内容: 对SQL表连接有个大概的了解之后,我们通过一个小例子进一步来学习一下.首先,我建立和两张表:如下 外连接 外连接包括左外连接.右外连接和完整外连接. 左外连接 SQL语句:select * from table1 left join table2 on table1.id=tab

sql表分区

1.单表达多少条数据后需要分区呢?   a.个人认为要似情况而定,有些常操作的表,分区反而带来麻烦,可以采用物理分表以及其它方法处理:   b.对于一些日志.历史订单类的查询数据,500w左右即可享受分区带来的优越性: c.可以将分区映射到文件组,每个分区访问一个不同的物理磁盘驱动器,以便提高 I/O 性能 在设计数据库时,经常没有考虑到表分区的问题,往往在数据表承重的负担越来越重时,才会考虑到分区方式,这时,就涉及到如何将普通表转换成分区表的问题了. 那么,如何将一个普通表转换成一个分区表 呢

SQL表连接图解:各种连接关系图

估计很多人在学习SQL表连接的时候都会被各种类型的表连接搞得稀里糊涂的,现在好了,有了下面的图,就可以很直观的区分各种表连接了 可以通过图看下 多表查询分为 内.外连接 外连接分为左连接(left join 或left outer join).右连接(right join 或者 right outer join).和完整外部连接 (full join 或者 full outer join) 左连接(left join 或 left outer join)的结果就是left join子句中的左表的

sql 表中列值转成字符串

DECLARE @STR VARCHAR(8000)SELECT @STR=ISNULL(@STR+',','')+weixinuser FROM (SELECT DISTINCT weixinuser FROM v_sysbinduser)AS TSELECT @STR declare @output varchar(8000)select @output = coalesce(@output + ',' , '') + weixinuser from v_sysbinduserprint @

SQL表变量与临时表区别 + 非游标临时表遍历

SQL表变量与临时表区别 + 非游标临时表遍历 分类: SQL Server2009-11-27 17:01 1196人阅读 评论(2) 收藏 举报 sqlinsert存储sql servermicrosoftstatistics 问题 1:为什么在已经有了临时表的情况下还要引入表变量? 解答 1:与临时表相比,表变量具有下列优点: 如 SQL Server 联机丛书“表”(Table) 一文中所述,表变量(如局部变量)具有明确定义的范围,在该范围结束时会自动清除这些表变量. 与临时表相比,表变

sql 表变量的使用

最近第一次使用sql表变量,感觉挺好用,案例如下: declare @aaa table(Com_SiteGroupID uniqueidentifier)  --定义表变量 ---往表变量里写数据 insert into @aaa select Com_SiteGroupID from Com_SiteGroup where Com_StructureID [email protected] union all select a.Com_SiteBasicID from Com_SiteBas

sql表连接的几种方式

这里有两张表TableA和TableB,分别是姓名表和年龄表,用于我们例子的测试数据 TableA id name 1 t1 2 t2 4 t4 TableB id age 1 18 2 20 3 19 在开发中我们的业务需求有时候是复杂的,多张表联合查询的时候是有多种方式的,面对不同的需求, 灵活使用不同的表连接方式,那么表连接分成哪几种呢? 表连接有几种? sql表连接分成外连接.内连接和交叉连接. 一.外连接 概述: 外连接包括三种,分别是左外连接.右外连接.全外连接. 对应的sql关键字