abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
dnes 08:00 | Zajímavý software

Chafa (GitHub) je utilita a knihovna pro zobrazování libovolných obrázků v terminálu. Novinky v nejnovější verzi 1.8 v příspěvku na blogu.

Ladislav Hagara | Komentářů: 0
včera 12:11 | Nová verze

Společnost Jolla oznámila vydání verze 4.2.0 s kódovým názvem Verla mobilního operačního systému Sailfish OS (Wikipedie). Podrobný přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
18.9. 20:33 | Nová verze

Foreman (Wikipedie), nástroj pro kompletní správu životního cyklu fyzických i virtuálních serverů, byl vydán ve verzi 3.0. Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
18.9. 14:11 | Nová verze

Byla vydána nová stabilní verze 2.10.28 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP (GNU Image Manipulation Program). Verze 2.10.26 byla přeskočena. Přehled novinek v oznámení o vydání a v souboru NEWS na GitLabu. Vývojáři zdůrazňují opravu několika chyb ve verzi pro Windows. Nový GIMP je již k dispozici také na Flathubu.

Ladislav Hagara | Komentářů: 0
18.9. 13:55 | Nová verze

Český LibreOffice tým vydává překlad příručky LibreOffice Impress 7.0. Tato příručka je určena pro začátečníky i pokročilé uživatele aplikace Impress, prezentační komponenty v LibreOffice. S její pomocí můžete vytvářet snímky, které obsahují text, číslované a odrážkové seznamy, tabulky, grafy, videoklipy, kliparty a další objekty. Impress přichází s předdefinovanými textovými styly a předlohami snímků; můžete si také vytvořit vlastní. Příručka je ke stažení na stránce dokumentace. Tým nyní pracuje na překladu příruček Draw a Base.

Zdeněk Crhonek | Komentářů: 0
17.9. 20:00 | Nová verze

Bylo vydáno Ubuntu 18.04.6 LTS, tj. šesté opravné vydání Ubuntu 18.04 LTS s kódovým názvem Bionic Beaver (poznámky k vydání). Řešen je především problém s bootovaním předchozích instalačních obrazů se zapnutým Secure Bootem z důvodu revokace klíčů kvůli BootHole a dalším bezpečnostním chybám v zavaděči GRUB 2.

Ladislav Hagara | Komentářů: 2
17.9. 09:22 | Komunita

Vývojáři Ubuntu oznámili, že v Ubuntu Desktopu bude Firefox ve formátu deb nahrazen Firefoxem ve formátu snap vydávaným přímo Mozillou. Pravděpodobně již ve verzi 21.10.

Ladislav Hagara | Komentářů: 58
17.9. 08:00 | Nová verze

Deno (Wikipedie), běhové prostředí (runtime) pro JavaScript a TypeScript, bylo vydáno ve verzi 1.14. Přehled novinek v poznámkách k vydání.

Ladislav Hagara | Komentářů: 0
17.9. 07:00 | Komunita

Linux Mint má nové webové stránky. Pro porovnání stránky z minulého týdne.

Ladislav Hagara | Komentářů: 1
16.9. 22:55 | IT novinky

Dnes ve věku 81 let zemřel Clive Sinclair, známý především jako tvůrce počítače ZX Spectrum.

Ladislav Hagara | Komentářů: 10
Dotykový displej na notebooku nebo desktopu
 (37%)
 (7%)
 (5%)
 (52%)
Celkem 447 hlasů
 Komentářů: 11, poslední 18.9. 18:45
Rozcestník



Dotaz: SELECT v spojovacej podmienke

31.8. 13:23 julo
SELECT v spojovacej podmienke
Přečteno: 371×
Potrebujem pri spajani tabuliek vybrat najaktualnejsi zaznam.
SELECT ....
FROM table t
INNER JOIN table2 t2 ON ( (t2.id=t.id) AND ( (SELECT t2.label from t2 WHERE (t2.id=t.id) ORDER BY t2.datum DESC LIMIT 1) = t2.label) )
JOIN table3...
Oracle 11g vsak hlasi
Invalid expression JOIN table3
                        *
Oracle sice nepodporuje LIMIT do verzie 12c, ale to vsak irelevantne v tomto pripade, lebo evidentne aj bez toho ma s tym (ten isty) problem.

Teda moja otazka je, ci je takyto SELECT v spojovacej podmienke podporovany.

Odpovědi

31.8. 14:16 kaaja
Rozbalit Rozbalit vše Re: SELECT v spojovacej podmienke
A nebude lepší si t2 profiltrovat na poslední záznam pro dané pro dané ID a pak připojit?
select ....
from table t
inner join (
  select t2.*, row_number() over( partition by t2.id order by t2.datum DESC ) rn
  from table2 t2
) t2_filtered on t2_filtered.id = t.id and t2_filtered.rn =1
31.8. 18:26 j
Rozbalit Rozbalit vše Re: SELECT v spojovacej podmienke
Vyrabis cyklus/potencielne nekonecnou rekurzi, a to se parserum SQL vetsinou moc nelibi. A to nemluvim o tom, jak neuveritelne pomaly by neco takovyho bylo.

Takze viz predchozi, udelej si nejdriv select tech nejnovejsich zaznamu a ten joini. Udelat se to da ruzne. Muzes pouzit trebas inner join select ... , to se jako filtr chova.

---

Dete s tim guuglem dopice!
1.9. 07:35 Tomáš
Rozbalit Rozbalit vše Re: SELECT v spojovacej podmienke

Select v kauzuli "on" opravdu mít nemůžete. Do klauzuje "on" se píšou jenom predikáty pro spojení tabulek. Krom toho: co když vybrané "label" je stejné pro více záznamů? Pak by dotaz asi neudělal to co si představujete.

Řešení může být např.

select 
  t.*
  ,t2.*
from table t
join table2 t2 on  t.id=t2.id
join ( select id, max(datum) as max_datum from table2 group by id ) t3 on t3.id = t.id and t3.max_datum = t2.datum

Existuje i výkonější varianta jen s jedním joinem:

select 
  t.id
  ,max(t.value1) keep ( dense_rank first order by datum ) as value1
  ,max(t.value2) keep ( dense_rank first order by datum ) as value2
  ,...
  ,max(t2.valueA) keep ( dense_rank first order by datum ) as valueA
  ,max(t2.valueB) keep ( dense_rank first order by datum ) as valueB
  ,...
from table t
join table2 t2 on  t.id=t2.id
group by
  t.id

Snad je patern jasný. Agregační funkci max v prvním čtení ignoruje. Ta zafunguje jen v případě, že by jste neměl totální uspořádáni ( záznamy se stejným datumem pro jedno id). Podstatné pro seřazení je část s dense_rank first order by ... . Ta určuje řazení, podle kterého vyberete první/poslední záznam.

4.9. 03:34 kvr
Rozbalit Rozbalit vše Re: SELECT v spojovacej podmienke
Oracle po ruce nemám, ale v prvé řadě mi přijde nesmysl ta FROM vnořeného SELECT. t2 je prakticky alias na aktuální řádek, jaký má smysl SELECT z daného řádku a defakto porovnání samo se sebou (není-li t2 existující tabulka či alias předchozího SELECT) ?

Takže ta chyba může být dřív, akorát je z toho tak vedle, že spadne až o něco později a postěžuje si na zdánlivě korektní JOIN table3. ... což je tedy otázka, neboť zde je příklad useknutý...

K té první části tedy, jestli mělo být cílem najít nejnovější řádek s daným label, tak bych čekal znovu table2 t2i, například (zcela tam vypadnul label, který ale v původním příklad nedává příliš smysl, neboť by měl být vždycky stejný - chce to vyjasnit cíl, potom se dá dořešit):

SELECT .... FROM table t INNER JOIN table2 t2 ON ( (t2.id = (SELECT t2i.id from table2 t2i WHERE (t2i.id=t.id ) ORDER BY t2i.datum DESC LIMIT 1) ) ) JOIN table3...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.