PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Комбиниране на 2 SELECT заявки

Изглежда, че искате да създадете изход, който изброява 5-те трамвая, пътуващи от дадена гара до City Square и 5-те трамвая, отиващи от City Square до друга станция. В този случай - не правите никаква връзка (например навреме) между тези две неща - трябва да се присъедините към псевдоколона, row_number() OVER () идва на ум:

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

Във всяка от подзаявките избирате петте интересни реда. Тъй като няма очевидна собственост, можете да JOIN върху тези два набора редове, трябва да създадете някаква псевдо-колона, която може да служи за тази цел (имате нужда от нещо, към което да се присъедините, или ще получите CROSS JOIN което води до 5 x 5 реда в изхода). Използване на row_number() OVER () AS rn прави точно това:създава нова колона с псевдоним rn който съдържа номера на реда в целия набор от редове (OVER () , 5 реда поради LIMIT клауза). Правите това и в двете подзаявки, за да можете да го използвате като условие за присъединяване:USING (rn) . Не е необходимо да използвате тази колона в изхода.

Нямате контрол върху това кои 5 часа на трамвая ще бъдат изброени. Ако искате това, трябва да направите нещо като WHERE dt1 > CURRENT_TIME и ORDER BY dt1 и в двете подзаявки или нещо в тази насока.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвам динамични имена на колони в оператор UPDATE или SELECT във функция?

  2. PL/pgSQL и SQL в PostgreSQL на същото ниво ли са като SQL/PSM стандарт, вместо само като SQL стандарт?

  3. Как да попълните външни ключове на таблица от други таблици

  4. Как да пресечете данни от таблици на postgres

  5. Защо прагът на подготвения израз на PostgreSQL JDBC е по подразбиране 5?