SQL dotázek

Re:SQL dotázek
« Odpověď #15 kdy: 18. 11. 2019, 20:57:25 »
Jak pak asi dopadne tohle?
Kód: [Vybrat]
jmeno;auto
Petr;Audi
Petr;Citroen
Petr;Audi
Ludvik;Nissan
Jarda;Nissan;
Jarda;Citroen
Karel;Audi
Filip;Audi

Ale to už tu bylo zmíněno, že?

Select je jen schematicky, prosím nepeskujte mě, pokud neprojde, píšu je z ruky.
Nicméně to, že HAVING je podmínka vztahující se na záznamy po seskupení (na rozdíl od WHERE), a proto se píše až za GROUP BY, byste mohl vědět, i když to píšete z ruky. Pořadí WHERE, GROUP BY, HAVING a ORDER BY je dané tím, jak se (jakoby) postupně aplikují na sadu záznamů.


Re:SQL dotázek
« Odpověď #16 kdy: 18. 11. 2019, 21:03:48 »
Jak pak asi dopadne tohle?
Kód: [Vybrat]
jmeno;auto
Petr;Audi
Petr;Citroen
Petr;Audi
Ludvik;Nissan
Jarda;Nissan;
Jarda;Citroen
Karel;Audi
Filip;Audi

Ale to už tu bylo zmíněno, že?

Pokud se Vám toto v datech vyskytuje, pak musíte změnit podmínku na HAVING count(DISTINCT vazba_right).
Smysluplnější by bylo přidat UNIQUE INDEX ON tbl_vazba (vazba_left, vazba_right).

Re:SQL dotázek
« Odpověď #17 kdy: 18. 11. 2019, 21:14:52 »
A nejde to třeba jednodušeji pomoci průniku?

(SELECT jmeno FROM auta WHERE auto='Nissan')
INTERSECT
(SELECT jmeno FROM auta WHERE auto='Audi')

Jak z SQL databáze záznamy odpovídající podmínce? Názorný příklad : tabulka lidí(bez normalizovaní), která vlastní auta (pro jednoduchost značky). Chci vybrat lidi, kteří vlastní alespoň Nissan a audi (nebo alternativně řádky tabulky patřící této osobě).

Re:SQL dotázek
« Odpověď #18 kdy: 18. 11. 2019, 21:27:13 »
A nejde to třeba jednodušeji pomoci průniku?

Ano, to by šlo, ale např. MySQL INTERSECT neumí.
(Jen pro doplnění: INTERSECT by sloužil pro AND, pro OR by se zase použil UNION)

Nevýhodou tohoto řešení by byla komplikovanost, pokud by se hledal průnik (nebo union) pro více hodnot než pro vzorové dvě. Dotaz by pak (ne)úměrně narůstal.

Re:SQL dotázek
« Odpověď #19 kdy: 18. 11. 2019, 22:14:49 »
Kód: [Vybrat]
select jmeno
from T
where auto in ('Nissan','Audi')
group by jmeno
having count(*) = 2 -- nebo > 1 pokud hledáte vlastníka alespoň jednoho z vozidel
Vše ostatní bude mít větší algoritmickou složitost. ( join, intersection = zakuklený join ).

Nevím co je to za divnou mánii posuzovat složitost selectu podle existence subselectu. Subselect je regulérní logická konstrukce ( stejně jako závorky v algebře čísel ). I dotaz s několika subselecty může být jednoduchý na vyhodnocení a naopak pouhý jeden join (s disjunktivní join podmínkou) může být totální zabiják.


Re:SQL dotázek
« Odpověď #20 kdy: 19. 11. 2019, 09:08:07 »
Kód: [Vybrat]
select jmeno
from T
where auto in ('Nissan','Audi')
group by jmeno
having count(*) = 2 -- nebo > 1 pokud hledáte vlastníka alespoň jednoho z vozidel

Jsem jen blba uklizecka, ale tohle podle me vubec neresi situaci, kdy ma uzivatel napr. 2 Nissany a zadne Audi.

Re:SQL dotázek
« Odpověď #21 kdy: 19. 11. 2019, 09:58:23 »
Kód: [Vybrat]
select jmeno
from T
where auto in ('Nissan','Audi')
group by jmeno
having count(*) = 2 -- nebo > 1 pokud hledáte vlastníka alespoň jednoho z vozidel

Jsem jen blba uklizecka, ale tohle podle me vubec neresi situaci, kdy ma uzivatel napr. 2 Nissany a zadne Audi.

Na to stačí přepsat na HAVING count(DISTINCT *).