我在SQL中遇到了以下有趣的情况。我正在寻找帮助/建议来解决这里的专家。
我有两个表,Table1和Table2。
表1包含以下字段:
R_ID| R_NUMBER | DIRECTION |FROM_KM | TO_KM
1 335 A 10 15
2 335 B 11 13
3 770 A 15.5 18.7
4 770 B 15 19
5 5510 1 15.95 17.35
表2如下
R_ID| R NUMBER | DIRECTION |KM LOCATION
1 335 A 10
2 335 A 10.3
3 335 A 10.5
4 335 A 10.7
5 335 A 11
6 335 B 12
7 335 B 12.5
8 335 B 13
9 770 A 15
10 770 B 16.5
11 770 A 17
12 770 A 18.5
13 770 B 19
16 5510 1 15.97
17 5510 1 15.99
18 5510 1 16.07
19 5510 1 16.17
20 5510 1 16.27
21 5510 1 16.37
22 5510 1 16.47
23 5510 1 16.47
24 5510 1 16.57
25 5510 1 16.67
26 5510 1 16.77
27 5510 1 16.87
28 5510 1 16.97
29 5510 1 17.07
30 5510 1 17.17
31 5510 1 17.27
32 5510 1 17.35
33 5510 1 17.37
34 5510 1 18.37
我想基于路线号,方向连接两个表,并在表1的“from_km”和“to_km”值的范围之间动态填充table2的“KM位置字段”。
期望如下:
R_ID| R_NUMBER | DIRECTION |FROM_KM | TO_KM | KM_LOCATION
1 335 A 10 15 10,10.3,10.5,10.7,11
2 335 B 11 13 12,12.5,13
3 770 A 15.5 18.7 15,17,18.5
4 770 B 15 19 16.5,19
5 5510 1 15.95 17.35 15.97,............., 17.35
此外,表2的ID:33,34不应包括在结果中,因为它超出了from_km,to_km of table1的范围。
我尝试了两个表之间的简单连接,但我遇到了所有匹配元组的table1的路由id重复条目。
从需求描述中,假设数据库是oracle(11及以上)listagg和pivot函数就足够了......例如:
select t1.route_id,
t1.route_number,
t1.direction,
t1.from_km,
t1.to_km
,
(select listagg(km_location,',') from table2 t2
where t2.route_number=t1.route_number
and t2.direction=t1.direction) as km_loc
from table1 t1;
-- output:
ROUTE_ID ROUTE_NUMBER DIRECTION FROM_KM TO_KM KM_LOC
1 335 A 10 15 10,15,11,10.7,10.5,10.3
2 335 B 11 13 12,13,12.5
3 770 A 15.5 18.7 17,18.5
4 770 B 15 19 16.5,19
如果想在单独的列中使用km_loc,请使用pivot功能。
如果需要更多,请分享您尝试的查询以及您遇到的确切问题...
如果它在PLSQL中,我们可以通过执行立即执行命令来获得动态选择查询...