我有一个数据库,里面有一个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
这条语句存在一个问题,就是查出来的语句不够,只有一半的数量
这叫一个乱啊
1、Select Point.PID as PID, Point.PID as StartNO ,这个PID不是重复吗?就改了个字段名。
2、你的抽象说明能力不够的话,上数据吧。表point 5~6行, 表Line 5~6行, 希望的结果表。
你可以用EXCEL做一下。
@郅濠:
你可以分解成多步,就简单了。
Line: PID, StartPoin, EndPoint
Point: id, Point, Title
Result: PID, StartTitle, EndTitle
1、Select PID, StartTitle=B.Title, EndPoint from Line A inner join Point B on A.StartPoint=B.Point 2、Select 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学会分解成简单的就可以了。
@爱编程的大叔: 嗯嗯,我先试试,多谢了
@爱编程的大叔: 这个语句只查询了一半的要求,还有一半相当于将Line表中的EndPoint和StartPOINT互换了一下,查询出来的结果,你的这个Sql语句只能其实只能查出我例子中的4条记录,实际上我想要的是8条记录
@郅濠: 请问5~8从哪儿来?
@爱编程的大叔: 因为客户给我的需求里面,一条线A有两个端点:StartPoint、EndPoint,这个是一条Line记录,可是要求里面说这个线是具有方向的,就是最后的结果出来,这条线记录就变成了两条,一个是从StartPoint到EndPoint,另外一个是EndPoint到StartPoint(即这条记录就是将StartPoint的值和EndPoint的值互换了)
@郅濠: 我的意思是,如果这样,你的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完全无关。就是一个无关字段。
另外,方法我已经告诉你了,你用分步法肯定能做出来的。
@爱编程的大叔: rusult里面的ID是它自己的ID,和其他表的ID没有联系,我当时只是做了一个示意的表,所以没改它,不好意思
@郅濠:
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 亲测运行无误。
@爱编程的大叔: 非常感谢,确实是对的,主要是因为自己好久没用数据库了,有些命令已经记不住了,所以才半天弄不出来