SQL dotaz

14 views
Skip to first unread message

Jan Marek

unread,
Mar 13, 2024, 2:57:57 AMMar 13
to postgr...@googlegroups.com
Dd,

potřeboval bych poradit s jedním dotazem - zkoušel jsem
googlovat, ale asi nevím, jak se na to správně zeptat...

Mám tabulku osob, kde je osobidno jako primární klíč a tabulku
kurzů k těmto osobám - zde je také osobidno, přes kterou lze tyto
dvě tabulky svázat. Tabulky vypadají např. takto:

osoby:
- jmeno
- prijmeni
- osobidno
- status

kurzy:
- osobidno
- kurzidno
- aktivni (true/false)
- nazev
- zacatek (datum)
- konec (datum)


Potřeboval bych udělat pohled, kde ke každé osobě budu mít jednu
hodnotu kurzidno z tabulky kurzů, ale tak, že v tabulce kurzů mám aktivní
i neaktivní (staré) kurzy k dané osobě a já bych potřeboval
udělat výběr takto:

- pokud má aktivní kurzy, pak "nejstarší", tj. ten, který začal
nejdříve
- pokud má _pouze_ neaktivní, pak ten, který poslední skončil.

Vůbec nevím, jak do toho... Asi by mi stačilo u té druhé tabulky
udělat UNION dle daných podmínek, tedy:

SELECT kurzidno FROM kurzy WHERE aktivni ORDER BY zacatek
UNION SELECT kurzidno FROM kurzy WHERE NOT aktivni ORDER BY
konec DESC

Ale nevím, jak z nich vybrat tu jednu (první) hodnotu a provázat
to s druhou tabulkou?

Děkuju předem.

Zdraví
Honza Marek
--
Ing. Jan Marek
University of South Bohemia
Academic Computer Centre
Phone: +420389032080
http://www.gnu.org/philosophy/no-word-attachments.cs.html
signature.asc

Josef Capek, DATONA

unread,
Mar 13, 2024, 5:02:31 AMMar 13
to postgr...@googlegroups.com


Ahoj,

co takhle SELECT DISTINCT ON (osobidno) ...  ?
To by ti mohlo pomoct

Pepa

Hezky den
Josef Capek, DATONA s.r.o.
tel. 603 430 733
________________________________________
Od: 'Jan Marek' via PostgreSQL-cz <postgr...@googlegroups.com>
Odesláno: 13. března 2024 7:57
Komu: postgr...@googlegroups.com
Předmět: SQL dotaz
--
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny PostgreSQL-cz ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu postgresql-c...@googlegroups.com.
Chcete-li zobrazit tuto diskusi na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/ZfFOb_Vh_BlRA6hF%40hazard.jcu.cz.

Jan Michálek

unread,
Mar 13, 2024, 6:03:11 AMMar 13
to postgr...@googlegroups.com
Použij prostě lateral

SELECT * FROM
osoby
LEFT JOIN LATERAL (
    SELECT * FROM kurzy
    WHERE kurzy.osid = osby.osid
    ORDER BY
    aktivni desc, konec desc
    LIMIT 1
) kk
On true

-- pokud chceš mít i osoby bez kurzů, jinak :

SELECT * FROM
osoby,
LATERAL (
    SELECT * FROM kurzy
    WHERE kurzy.osid = osby.osid
    ORDER BY
    aktivni desc, konec desc
    LIMIT 1
) kk


st 13. 3. 2024 v 10:02 odesílatel Josef Capek, DATONA <cap...@datona.cz> napsal:
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/postgresql-cz/1710320545825.59249%40datona.cz.


--
Jelen
Starší čeledín datovýho chlíva
Reply all
Reply to author
Forward
0 new messages