PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Kombinieren von 2 SELECT-Abfragen

So wie es aussieht, möchten Sie eine Ausgabe erstellen, die die 5 Straßenbahnen auflistet, die von einer Station zum City Square fahren, und 5 Straßenbahnen, die vom City Square zu einer anderen Station fahren. In diesem Fall – Sie stellen zwischen diesen beiden Dingen keine Verbindung (z. B. zeitlich) her – sollten Sie in einer Pseudo-Spalte row_number() OVER () verbinden fällt mir ein:

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 jeder der Unterabfragen wählen Sie die fünf interessierenden Zeilen aus. Da es kein offensichtliches Eigentum gibt, können Sie JOIN werden Wenn Sie diese beiden Sätze von Zeilen verwenden, müssen Sie eine Pseudo-Spalte erstellen, die diesem Zweck dienen kann (Sie brauchen etwas zum Verbinden, oder Sie erhalten einen CROSS JOIN was zu 5 x 5 Zeilen in der Ausgabe führt). Verwenden von row_number() OVER () AS rn tut genau das:es erstellt eine neue Spalte mit dem Alias ​​rn die die Zeilennummer über den gesamten Zeilensatz enthält (OVER () , 5 Zeilen wegen LIMIT Klausel). Sie tun dies in beiden Unterabfragen, damit Sie es als Join-Bedingung verwenden können:USING (rn) . Sie müssen diese Spalte nicht in der Ausgabe verwenden.

Sie haben keine Kontrolle darüber, welche 5 Straßenbahnzeiten aufgelistet werden. Wenn Sie das möchten, sollten Sie so etwas wie WHERE dt1 > CURRENT_TIME tun und ORDER BY dt1 in beiden Unterabfragen oder so ähnlich.