Pelo que parece, você deseja criar uma saída que liste os 5 bondes que vão de alguma estação para a City Square e 5 bondes que vão da City Square para alguma outra estação. Neste caso - você não está fazendo nenhuma conexão (por exemplo, pontualmente) entre essas duas coisas - você deve juntar em uma pseudo-coluna,
row_number() OVER ()
vem à mente:SELECT '$name' AS name1, w1.time1, 'City Square - arrival' AS name2, w1.time2,
'City Square - departure' AS name3, w2.time3, '$name2' AS name4, w2.time4
FROM (
SELECT dt1.time AS time1, dt2.time AS time2, row_number() OVER () AS rn
FROM departure_times AS dt1
JOIN departure_times AS dt2 USING (tram_id)
WHERE dt1.name = '$name' AND dt2.name = 'CitySquare'
LIMIT 5) w1
JOIN (
SELECT dt1.time AS time3, dt2.time AS time4, row_number() OVER () AS rn
FROM departure_times AS dt1
JOIN departure_times AS dt2 USING (tram_id)
WHERE dt1.name = 'CitySquare' AND dt2.name = '$name2'
LIMIT 5) w2 USING (rn);
Em cada uma das subconsultas você seleciona as cinco linhas de interesse. Como não há propriedade aparente, você pode
JOIN
nesses dois conjuntos de linhas, você precisa criar alguma pseudo-coluna que possa servir a esse propósito (você precisa de algo para unir ou obterá um CROSS JOIN
resultando em 5 x 5 linhas na saída). Usando row_number() OVER () AS rn
faz exatamente isso:cria uma nova coluna com o alias rn
que contém o número da linha em todo o conjunto de linhas (OVER ()
, 5 linhas devido ao LIMIT
cláusula). Você faz isso em ambas as subconsultas para poder usá-lo como condição de junção:USING (rn)
. Você não precisa usar essa coluna na saída. Você não tem controle sobre quais 5 horários de bonde serão listados. Se você quiser isso, você deve fazer algo como
WHERE dt1 > CURRENT_TIME
e ORDER BY dt1
em ambas as subconsultas, ou algo nesse sentido.