PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Combinaison de 2 requêtes SELECT

À première vue, vous souhaitez créer une sortie qui répertorie les 5 tramways allant d'une station à City Square et les 5 tramways allant de City Square à une autre station. Dans ce cas - vous ne faites aucun lien (par exemple, à temps) entre ces deux choses - vous devez joindre sur une pseudo-colonne, row_number() OVER () me vient à l'esprit :

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);

Dans chacune des sous-requêtes, vous sélectionnez les cinq lignes qui vous intéressent. Puisqu'il n'y a pas de propriété apparente, vous pouvez JOIN ces deux ensembles de lignes, vous devez créer une pseudo-colonne qui peut servir à cette fin (vous avez besoin de quelque chose pour vous joindre ou vous obtiendrez un CROSS JOIN résultant en 5 x 5 lignes dans la sortie). Utilisation de row_number() OVER () AS rn fait exactement cela :il crée une nouvelle colonne avec l'alias rn qui contient le numéro de ligne sur tout l'ensemble de lignes (OVER () , 5 lignes à cause de la LIMIT clause). Vous faites cela dans les deux sous-requêtes afin de pouvoir l'utiliser comme condition de jointure :USING (rn) . Vous n'êtes pas obligé d'utiliser cette colonne dans la sortie.

Vous n'avez aucun contrôle sur les 5 heures de tram qui seront répertoriées. Si vous voulez cela, vous devriez faire quelque chose comme WHERE dt1 > CURRENT_TIME et ORDER BY dt1 dans les deux sous-requêtes, ou quelque chose dans ce sens.