首页 新闻 会员 周边

sql 同一张表上两次连接

0
悬赏园豆:10 [已解决问题] 解决于 2015-03-05 11:44

我有一个数据库,里面有一个Point表和一个Line表,Point表里面有字段PID、ExpNo,Line里面有StartNo、EndNo,StartNo和EndNo是不一致的,ExpNo和StartNo、EndNo是对应的,我想用Sql语句查询出StartNo=ExpNo和EndNo=ExpNo的所有数据,结果中的StartNo和EndNo分别用其对应的PID代替

 

Select Point.PID,Line.StartNo,Line.EndNo From Point Inner Join Line On Point.ExpNo=Line.StartNo Or Point.ExpNo=Line.EndNo

这句语句存在一个问题就是我虽然把这些记录都查询出来了,可是并没有将结果中的StartNo和EndNo分别用其对应的PID代替,而且我想要查询的结果里面EndNo=ExpNo的记录,想把EndNo作为StartNo来用;

Select Point.PID as PID, Point.PID as StartNO,NewPoint.PID as EndNo From (Line Left outer join Point On Line.StartNo=Point.ExpNo) Left Outer Join Point as NewPoint On Line.EndNo=NewPoint.ExpNo

这条语句存在一个问题,就是查出来的语句不够,只有一半的数量

sql
郅濠的主页 郅濠 | 初学一级 | 园豆:171
提问于:2015-03-05 09:46
< >
分享
最佳答案
0

这叫一个乱啊

1、Select Point.PID as PID, Point.PID as StartNO ,这个PID不是重复吗?就改了个字段名。

2、你的抽象说明能力不够的话,上数据吧。表point 5~6行, 表Line 5~6行, 希望的结果表。

你可以用EXCEL做一下。

收获园豆:10
爱编程的大叔 | 高人七级 |园豆:30839 | 2015-03-05 09:53
郅濠 | 园豆:171 (初学一级) | 2015-03-05 10:10

@郅濠: 

你可以分解成多步,就简单了。

Line: PID, StartPoin, EndPoint

Point: id, Point,  Title

Result: PID, StartTitle, EndTitle

 

1Select PID,  StartTitle=B.Title, EndPoint from Line A
  inner join Point B
  on A.StartPoint=B.Point

2Select PID, StartTitle, EndTitle=Y.Title from 
   (Select PID,  StartTitle=B.Title, EndPoint from Line A
      inner join Point B
      on A.StartPoint=B.Point) X
            inner join Point Y
         on X.EndPoint=Y.Point
第二步()里面的是第一步的内容,你以后碰到复杂SQL学会分解成简单的就可以了。
爱编程的大叔 | 园豆:30839 (高人七级) | 2015-03-05 10:26

@爱编程的大叔: 嗯嗯,我先试试,多谢了

郅濠 | 园豆:171 (初学一级) | 2015-03-05 10:27

@爱编程的大叔: 这个语句只查询了一半的要求,还有一半相当于将Line表中的EndPoint和StartPOINT互换了一下,查询出来的结果,你的这个Sql语句只能其实只能查出我例子中的4条记录,实际上我想要的是8条记录

郅濠 | 园豆:171 (初学一级) | 2015-03-05 10:57

@郅濠: 请问5~8从哪儿来?

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-03-05 10:59

@爱编程的大叔: 因为客户给我的需求里面,一条线A有两个端点:StartPoint、EndPoint,这个是一条Line记录,可是要求里面说这个线是具有方向的,就是最后的结果出来,这条线记录就变成了两条,一个是从StartPoint到EndPoint,另外一个是EndPoint到StartPoint(即这条记录就是将StartPoint的值和EndPoint的值互换了)

郅濠 | 园豆:171 (初学一级) | 2015-03-05 11:03

@郅濠: 我的意思是,如果这样,你的RESULT表应该是

PID 起点点号 终点点号
1 JS1 JS2
2 JS2 JS3
3 JS3 JS4
4 JS2 JS1
1 JS3 JS2
2 JS4 JS3
3 JS1 JS4
4 JS4 JS1

不应该出现5~8,除非这个PID与原来的PID完全无关。就是一个无关字段。

 

另外,方法我已经告诉你了,你用分步法肯定能做出来的。

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-03-05 11:07

@爱编程的大叔: rusult里面的ID是它自己的ID,和其他表的ID没有联系,我当时只是做了一个示意的表,所以没改它,不好意思

郅濠 | 园豆:171 (初学一级) | 2015-03-05 11:09

@郅濠: 

SELECT B.Title AS StartTitle, C.Title AS EndTitle
FROM (Line AS A INNER JOIN Point AS B ON A.StartPoint = B.Point) INNER JOIN POINT AS C ON A.EndPoint = C.Point
union all
SELECT Y.Title AS StartTitle, Z.Title AS EndTitle
FROM (Line AS X INNER JOIN Point AS Y ON X.EndPoint = Y.Point) INNER JOIN POINT AS Z ON X.StartPoint = Z.Point;

Access 亲测运行无误。

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-03-05 11:24

@爱编程的大叔: 非常感谢,确实是对的,主要是因为自己好久没用数据库了,有些命令已经记不住了,所以才半天弄不出来

郅濠 | 园豆:171 (初学一级) | 2015-03-05 11:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册