sql >> Databáze >  >> RDS >> PostgreSQL

Kombinace 2 SELECT dotazů

Podle toho, jak to vypadá, chcete vytvořit výstup, který uvádí 5 tramvají jedoucích z některé stanice na City Square a 5 tramvají jedoucích z City Square do jiné stanice. V tomto případě – mezi těmito dvěma věcmi nevytváříte žádné spojení (například včas) – byste se měli připojit v pseudosloupec, row_number() OVER () napadá mě:

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

V každém z poddotazů vyberete pět řádků zájmu. Protože neexistuje žádná zjevná vlastnost, můžete se JOIN na těchto dvou sadách řádků, musíte vytvořit nějaký pseudosloupec, který může sloužit tomuto účelu (potřebujete něco, na co se připojíte, nebo dostanete CROSS JOIN výsledkem je 5 x 5 řádků na výstupu). Pomocí row_number() OVER () AS rn dělá právě to:vytvoří nový sloupec s aliasem rn který obsahuje číslo řádku přes celou sadu řádků (OVER () , 5 řádků z důvodu LIMIT doložka). Provedete to v obou dílčích dotazech, abyste to mohli použít jako podmínku spojení:USING (rn) . Tento sloupec nemusíte ve výstupu použít.

Nemáte žádnou kontrolu nad tím, které 5 časy tramvají budou uvedeny. Pokud to chcete, měli byste udělat něco jako WHERE dt1 > CURRENT_TIME a ORDER BY dt1 v obou dílčích dotazech nebo něco v tomto smyslu.



  1. Vložte více řádků se stejným primárním klíčem do SQL pomocí php

  2. PostgreSQL - syntaxe DISTINCT ON a GROUP BY

  3. Podvýběr v oracle

  4. Odstraňování problémů:Příliš mnoho přesměrování