什么情况下 会用到 自连接

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

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 (
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) ) b on a.id=b.companyid
image 

然后参考的资料是

 

一个表与自身进行连接,称为自连接
有一个学生表,里面有 学号 功课编号 学生成绩三个字段.
用一个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’

posted @ 2012-02-01 15:34  那年那月  阅读(1223)  评论(0编辑  收藏  举报