有一个公交线路的站点明细表,如下:
line_detail表:
id line direction station_num station
1 3800 上行 1 站点a
2 3800 上行 2 站点b
3 3800 上行 3 站点c
4 3800 下行 1 站点a
5 3800 下行 2 站点b
6 3800 下行 3 站点c现在我需要查询上下行两个两个站点的组合,先后顺序无所谓,查询得到的结果应该是这样的:
staion_shang station_xia
站点a 站点b
站点a 站点c
站点b 站点c我写的sql语句是这样的:
select a.station , b.station from (select * from line_detail d1 where d1.direction='上行' and d1.line='3800') a,(select * from line_detail d1 where d1.direction='下行' and d1.line='3800') b
where a.station!=b.station这个sql查出来的结果一共有6个:
staion_shang station_xia
站点a 站点b
站点a 站点c
站点b 站点c
站点c 站点b
站点b 站点a
站点c 站点a但因为我需要的结果不用考虑先后顺序,所以( 站点a , 站点b)和( 站点b, 站点a)我只要一个就可以了。
请教各位大神,这个sql语句要怎样写才能得到我要的结果呢?
line_detail表:
id line direction station_num station
1 3800 上行 1 站点a
2 3800 上行 2 站点b
3 3800 上行 3 站点c
4 3800 下行 1 站点a
5 3800 下行 2 站点b
6 3800 下行 3 站点c现在我需要查询上下行两个两个站点的组合,先后顺序无所谓,查询得到的结果应该是这样的:
staion_shang station_xia
站点a 站点b
站点a 站点c
站点b 站点c我写的sql语句是这样的:
select a.station , b.station from (select * from line_detail d1 where d1.direction='上行' and d1.line='3800') a,(select * from line_detail d1 where d1.direction='下行' and d1.line='3800') b
where a.station!=b.station这个sql查出来的结果一共有6个:
staion_shang station_xia
站点a 站点b
站点a 站点c
站点b 站点c
站点c 站点b
站点b 站点a
站点c 站点a但因为我需要的结果不用考虑先后顺序,所以( 站点a , 站点b)和( 站点b, 站点a)我只要一个就可以了。
请教各位大神,这个sql语句要怎样写才能得到我要的结果呢?
-- 你的结果 minus 一下,看看是不是你要的结果 select staion_shang, station_xia from mytable
minus
select station_xia, staion_shang from mytable
WITH ts AS
(SELECT /*+ materialize */ * FROM ttt
WHERE line=3800)
SELECT DISTINCT s1.station,s2.station FROM ts s1
INNER JOIN ts s2
ON s1.station<>s2.station
AND s1.station_num=1;
或者用下面这种:
WITH ts AS
(SELECT /*+ materialize */ * FROM ttt
WHERE line=3800)
SELECT s1.station,s2.station FROM ts s1
INNER JOIN ts s2
ON s1.station<>s2.station
AND s1.station_num=1
AND S1.DIRECTION<>'上行'
AND S2.DIRECTION<>'上行';
数据量大第2种可能要快些。
然后分组group by a.station,b.station
FROM (SELECT LINE,
DIRECTION,
STATION_NUM,
STATION,
LEAD(STATION) OVER(ORDER BY ID) PRESTATION
FROM LINE_DETAIL)
WHERE PRESTATION IS NOT NULL;