sql >> Base de Datos >  >> RDS >> PostgreSQL

Combinando 2 consultas SELECT

Aparentemente, desea crear una salida que enumere los 5 tranvías que van de alguna estación a City Square y los 5 tranvías que van de City Square a otra estación. En este caso, no está haciendo ninguna conexión (por ejemplo, a tiempo) entre estas dos cosas, debe unirse en una pseudocolumna, row_number() OVER () viene a la 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);

En cada una de las subconsultas se seleccionan las cinco filas de interés. Como no hay una propiedad aparente, puede JOIN estos dos conjuntos de filas, debe crear alguna pseudocolumna que pueda servir para ese propósito (necesita algo para unirse o obtendrá un CROSS JOIN resultando en 5 x 5 filas en la salida). Usando row_number() OVER () AS rn hace precisamente eso:crea una nueva columna con alias rn que contiene el número de fila sobre todo el conjunto de filas (OVER () , 5 filas debido al LIMIT cláusula). Haces esto en ambas subconsultas para que puedas usarlo como la condición de unión:USING (rn) . No tiene que usar esta columna en la salida.

No tiene control sobre qué 5 horarios de tranvía se mostrarán. Si quieres eso, deberías hacer algo como WHERE dt1 > CURRENT_TIME y ORDER BY dt1 en ambas subconsultas, o algo por el estilo.