sql >> Database >  >> RDS >> PostgreSQL

2 SELECT-query's combineren

Zo te zien wil je een output maken met de 5 trams die van een station naar City Square gaan en 5 trams die van City Square naar een ander station gaan. In dit geval - je maakt geen verbinding (bijvoorbeeld op tijd) tussen deze twee dingen - moet je meedoen op een pseudo-kolom, row_number() OVER () komt in me op:

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 elk van de subquery's selecteert u de vijf relevante rijen. Aangezien er geen duidelijke eigenschap is, kunt u DOEN deze twee sets rijen aan, moet je een pseudo-kolom maken die dat doel kan dienen (je hebt iets nodig om mee te doen of je krijgt een CROSS JOIN wat resulteert in 5 x 5 rijen in de uitvoer). row_number() OVER () AS rn doet precies dat:het maakt een nieuwe kolom aan met alias rn die het rijnummer over de hele rijset bevat (OVER () , 5 rijen vanwege de LIMIT clausule). Je doet dit in beide subquery's zodat je het als de join-voorwaarde kunt gebruiken:USING (rn) . U hoeft deze kolom niet in de uitvoer te gebruiken.

Je hebt geen controle over welke 5 tramtijden worden vermeld. Als je dat wilt, moet je zoiets doen als WHERE dt1> CURRENT_TIME en BESTEL DOOR dt1 in beide subquery's, of iets in die richting.



  1. Update mysql-tabel op opdracht Invoegen

  2. Mysql-databases optimaliseren

  3. hoe sql-query te schrijven om rijen met maximale waarde in één kolom te selecteren

  4. MySQL - Efficiënt combineren van twee select-statements in één resultaat met LIMIT