PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Combinando 2 consultas SELECT


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.