PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Combinando 2 query SELECT

A quanto pare, vuoi creare un output che elenchi i 5 tram che vanno da una stazione a City Square e 5 tram che vanno da City Square a qualche altra stazione. In questo caso - non stai effettuando alcuna connessione (per esempio, in tempo) tra queste due cose - dovresti unirti su una pseudo-colonna, row_number() OVER () mi viene in 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);

In ciascuna delle sottoquery selezioni le cinque righe di interesse. Dal momento che non c'è alcuna proprietà apparente, puoi JOIN su queste due serie di righe, devi creare una pseudo-colonna che possa servire a tale scopo (hai bisogno di qualcosa su cui unirti o otterrai un CROSS JOIN risultando in 5 x 5 righe nell'output). Utilizzo di row_number() OVER () AS rn fa proprio questo:crea una nuova colonna con alias rn che contiene il numero di riga sull'intero set di righe (OVER () , 5 righe a causa del LIMIT clausola). Lo fai in entrambe le sottoquery in modo da poterlo utilizzare come condizione di unione:USING (rn) . Non è necessario utilizzare questa colonna nell'output.

Non hai alcun controllo su quali 5 orari del tram verranno elencati. Se lo desideri, dovresti fare qualcosa come WHERE dt1 > CURRENT_TIME e ORDER BY dt1 in entrambe le sottoquery o qualcosa del genere.