什么情况下 会用到 自连接

本文详细介绍了SQL自连接的概念、语法结构及其在解决实际问题中的应用案例,包括通过自连接查询找出每门课程成绩最好的前两名,以及在公交查询场景中的应用。通过实例分析,展示了自连接在数据库查询中的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天遇到这样的一个情况  需要获取一个公司的基本信息(可以从公司基本表获取),另外有一个跟进情况表,我要获取每个公司的最新跟进情况.

image

由于每个公司,他的跟进信息是有很多条的,而我只需要最新的一条跟进信息.  于是就只能用到 自连接查询

SELECT DISTINCT comments1.*
FROM comments comments1 where comments1.id IN
(SELECT TOP 1 comments.id
FROM comments
WHERE comments.companyid = comments1.companyid
ORDER BY id DESC)

最后的总的sql是

select a.id as 后台公司id, CompanyAge as 公司成立时间, coname as 公司中文名称,Coename as 公司英文名称,Vip as 客户级别,Cocontact as 联系人名称,Cellphone as 手机号码,
Telephone as 固话,a.Gendanren as 跟进人,b.comments as 跟进情况 from company a
left join (
 ) b on a.id=b.companyid
 

然后参考的资料是

 

一个表与自身进行连接,称为自连接
有一个学生表,里面有 学号 功课编号 学生成绩三个字段.
用一个SQL查询语句得出每门功课成绩最好的前两名

学号 功课编号 学生成绩
1 1 99
2 1 98
3 1 100
4 2 88
5 2 87
6 2 88
7 3 99
8 3 88
9 3 100

解决方法
SELECT DISTINCT 学生表1.*
FROM 学生表 学生表1 where 学生表1.学号 IN
(SELECT TOP 2 学生表.学号
FROM 学生表
WHERE 学生表.功课编号 = 学生表1.功课编号
ORDER BY 学生成绩 DESC)

查询结果
学号 功课编号 学生成绩
1 1 99
2 1 98
4 2 88
6 2 88
7 3 99
9 3 100

 

实际上,好像 公交车的查询,也是用的子连接

能不能对一张表进行自我连接呢?答案是肯定的。
有没有必要对一张表进行自我连接呢?答案也是肯定的。
表的别名:
一张表可以自我连接。进行自连接时我们需要一个机制来区分一个表的两个实例。
在FROM clause中我们可以给这个表取不同的别名, 然后在语句的其它需要使用到该别名的地方用dot来连接该别名和字段名。
我们在这里同样给出两个表来对自连接进行解释。
爱丁堡公交线路,
车站表:
stops
公交线路表:
route
一、对公交线路表route进行自连接。
SELECTFROM route R1, route R2 WHERE R1.num=R2.num AND R1.company=R2.company
我们route表用字段来进行自连接. 结果是什么意思呢?
你可以知道每条公交线路的任意两个可联通的车站。
二、用stop字段来对route进行自连接。
SELECTFROM route R1, route R2 WHERE R1.stop=R2.sto
查询的结果就是共用同一车站的所有公交线。这个结果对换乘是不是很有意义呢。
从这两个例子我们可以看出,自连接的语法结构很简单,但语意结果往往不是那么轻易理解。就我们这里所列出的两个表,假如运用得当,能解决很多实际问题,例如,任意两个站点之间如何换乘。
SELECT R1.company, R1.num FROM route R1, route R2, stops S1, stops S2
WHERE R1.num=R2.num AND R1.company=R2.company AND R1.stop=S1.id AND R2.stop=S2.id
AND S1.name=’Craiglockhart’ AND S2.name=’Tollcross’

转载于:https://www.cnblogs.com/naniannayue/archive/2012/02/01/2334669.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值