下面有一个包含示例数据的表格。想知道表格中不同的电台组合。
Table Name: train_route
FROM_STN TO_STN DISTANCE
BLR CHENNAI 800
DEL MUMBAI 1500
VNS DEL 1000
MUMBAI DEL 1497
CHENNAI BLR 798
相同电台的不同记录的距离可能不同。我想知道表格中所有不同的电台组合。
例如:对于上面的样本,所需的输出将是
FROM_STN TO_STN
BLR CHENNAI
DEL MUMBAI
VNS DEL
实际的表格有数十亿条记录。任何可以使用自联接完成的事情?
答案 0 :(得分:0)
select tr.* from
(
select from_stn as frs, to_stn as tos
from train_route
union
select to_stn, from_stn
from train_route) t
join train_route tr on t.frs = tr.from_stn and t.tos = tr.to_stn
您可以使用union
删除重复项。
答案 1 :(得分:0)
如果只有不同的组合而不是哪个站是重要的,你可以只进行词法比较和交换位置,以便较低的站始终显示在第一列中,然后通过以下方式进行分组:
select
if(FROM_STN < TO_STN, FROM_STN, TO_STN) station1,
if(FROM_STN > TO_STN, FROM_STN, TO_STN) station2
from
train_route
group by
if(FROM_STN < TO_STN, FROM_STN, TO_STN),
if(FROM_STN > TO_STN, FROM_STN, TO_STN);
这会给你一个结果:
| station1 | station2 |
|----------|----------|
| BLR | CHENNAI |
| DEL | MUMBAI |
| DEL | VNS |
另一种可能表现更好的解决方案(取决于键和索引):
select distinct from_stn, to_stn
from
(
select from_stn, to_stn from train_route
union all
select to_stn, from_stn from train_route
) all_pairs
where from_stn < to_stn;
最后,我不认为有必要进行词汇比较。