Proč nefunguje tento SQL dotaz

Kit

Re:Proč nefunguje tento SQL dotaz
« Odpověď #15 kdy: 14. 10. 2018, 16:35:34 »
to datum zrovna pustili z ústavu? uvozovky? nic?
ty tabulky vazne s velbloudi notaci?
do joinu rvat podminky na datum? ok no
Kde je nějaká velbloudí notace? V ukázce žádnou nevidím.
predpokladam ze dalsi slovo v nazvu tabulky by zacinalo velkym pismenem.. pokud ne, bylo by to snad jeste horsi

To by ale nebyla velbloudí notace.

prosim zjisti si o tom neco

Ano, zjistil jsem, že PascalCase vypadá jinak než camelCase.

Prosím, zjisti si o tom něco.


hrgd

Re:Proč nefunguje tento SQL dotaz
« Odpověď #16 kdy: 14. 10. 2018, 18:38:33 »
to datum zrovna pustili z ústavu? uvozovky? nic?
ty tabulky vazne s velbloudi notaci?
do joinu rvat podminky na datum? ok no
Kde je nějaká velbloudí notace? V ukázce žádnou nevidím.
predpokladam ze dalsi slovo v nazvu tabulky by zacinalo velkym pismenem.. pokud ne, bylo by to snad jeste horsi

To by ale nebyla velbloudí notace.

prosim zjisti si o tom neco

Ano, zjistil jsem, že PascalCase vypadá jinak než camelCase.

Prosím, zjisti si o tom něco.

upper-CamelCase a lower-CamelCase, furt nic? otevri uz ten google prosim

Pavel...

Re:Proč nefunguje tento SQL dotaz
« Odpověď #17 kdy: 14. 10. 2018, 20:09:13 »
Jak už jsem psal, JOIN je jen modernější zápis podmínek pro spojování tabulek. Ve skutečnosti reprezentace dotazu pro plánovač už mezi zápisem s JOIN a s WHERE nerozlišuje, je to opravdu jen rozdíl v zápisu.

Navrhujem skuste si skor ako napisete nieco to aj overit.
Je principialny rozdiel medzi tym ked date podmienku do ON a WHERE. Vyhodnoti sa to radikalne inak.

pre povedzme "a outer join b":
ked date a.id=b.id do WHERE, vrati vam to riadky kde su zaznamy v oboch tabulkach.
ked date to iste do ON, vrati vam to aj pripady ked v jednej z tych tabuliek zaznam neexistuje

Re:Proč nefunguje tento SQL dotaz
« Odpověď #18 kdy: 14. 10. 2018, 20:56:27 »
Navrhujem skuste si skor ako napisete nieco to aj overit.
Navrhuju kuste si dřív, než něco napíšete, něco o tom zjistit a ověřit si to.

Je principialny rozdiel medzi tym ked date podmienku do ON a WHERE. Vyhodnoti sa to radikalne inak.
Nikoli, je to pouze rozdíl v zápisu. V exekučním plánu to nijak nepoznáte. Některé databáze ten rozdíl myslím setřou už v době parsování dotazu.

pre povedzme "a outer join b":
ked date a.id=b.id do WHERE, vrati vam to riadky kde su zaznamy v oboch tabulkach.
ked date to iste do ON, vrati vam to aj pripady ked v jednej z tych tabuliek zaznam neexistuje
No jo, to byste ale musel umět napsat OUTER JOIN. To, co jste napsal do WHERE, je INNER JOIN.

Následující zápisy jsou ekvivalentní (stará syntaxe OUTER JOINU je v syntaxi Oracle – pochází z doby, kdy JOIN ještě nebyl standardizován):
Kód: [Vybrat]
SELECT * FROM a LEFT OUTER JOIN b ON a.id = b.id;
SELECT * FROM a, b WHERE a.id = b.id(+);

Pokud nevěříte mně, např. v článku [ ( LEFT|RIGHT [ OUTER ])| INNER ] JOIN v SQLto psal Pavel Stěhule:

Citace
Není žádný rozdíl ve výkonnosti mezi použitím JOINu a původním zápisem pro spojení tabulek. Pamatuji doby, kdy se JOIN nepoužíval právě z obavy o ztrátu výkonu. To je nesmysl. Liší se pouze zápis. Smysl a provádění je stejné.
« Poslední změna: 14. 10. 2018, 21:01:35 od Filip Jirsák »

dw

Re:Proč nefunguje tento SQL dotaz
« Odpověď #19 kdy: 14. 10. 2018, 22:07:10 »
Jak už jsem psal, JOIN je jen modernější zápis podmínek pro spojování tabulek. Ve skutečnosti reprezentace dotazu pro plánovač už mezi zápisem s JOIN a s WHERE nerozlišuje, je to opravdu jen rozdíl v zápisu.

Navrhujem skuste si skor ako napisete nieco to aj overit.
Je principialny rozdiel medzi tym ked date podmienku do ON a WHERE. Vyhodnoti sa to radikalne inak.

pre povedzme "a outer join b":
ked date a.id=b.id do WHERE, vrati vam to riadky kde su zaznamy v oboch tabulkach.
ked date to iste do ON, vrati vam to aj pripady ked v jednej z tych tabuliek zaznam neexistuje

No... MySQL nie je nastastie jedina databaza, je tu dostatok DB ktorych planovac zvladne zaradit podmienku pred spojovanie aj ked ju ma az vo where...


Re:Proč nefunguje tento SQL dotaz
« Odpověď #20 kdy: 14. 10. 2018, 22:44:34 »
JOIN … ON je akorát modernější zápis podmínky ve WHERE pro spojování tabulek. Takže na tom, kam tu podmínku napíšete, nezáleží.
....
Zase Jirsak meles o vecech o kterych vis kulovy? Ten select se chova uplne jinak. Kdyz se podminka napise rovnou do join, tak se spojovani provadi uz nad omezenym poctem zaznamu, vs where, kde se nejdriv spoji vsechno a teprve pak se to omezuje, coz bude v drtivy vetsine pripadu radove pomalejsi.

Určitě není jedno, kam se zapíše predikát - v případě OUTER JOINů to může mít vliv na výsledek - je tam jiná sémantika. Zrovna tak ale není pravda, že by se napřed vyhodnocoval JOIN a poté WHERE. Databáze se snaží o push down predikátů - tj jakékoliv filtry - bez ohledu na to jestli jsou v JOINu nebo ve WHERE natlačit co nejhlouběji v prováděcím plánu - snažíte se omezit data ještě než s nimi cokoliv začnete dělat, případně se díky predikátům na úrovni listu stromu prováděcího plánu mohou vybrat indexy, které mohou rovnou vracet data po aplikování filtru.

Pavel...

Re:Proč nefunguje tento SQL dotaz
« Odpověď #21 kdy: 14. 10. 2018, 23:27:50 »
Následující zápisy jsou ekvivalentní (stará syntaxe OUTER JOINU je v syntaxi Oracle – pochází z doby, kdy JOIN ještě nebyl standardizován):
Kód: [Vybrat]
SELECT * FROM a LEFT OUTER JOIN b ON a.id = b.id;
SELECT * FROM a, b WHERE a.id = b.id(+);

Pokud nevěříte mně, např. v článku [ ( LEFT|RIGHT [ OUTER ])| INNER ] JOIN v SQLto psal Pavel Stěhule:

Citace
Není žádný rozdíl ve výkonnosti mezi použitím JOINu a původním zápisem pro spojení tabulek. Pamatuji doby, kdy se JOIN nepoužíval právě z obavy o ztrátu výkonu. To je nesmysl. Liší se pouze zápis. Smysl a provádění je stejné.

au...
a) skuste si precitat co pise Vami odkazovany text: "vykonnostny rozdiel".
b) pouzit Oracle syntax, ktora je syntakticky cukor ako agument, znaci, ze ocividne netusite o com pisete.
c) ano, vami uvedene dve SQLka nemaju prakticky rozdiel, ale to sa samozrejme netyka toho na co reagujete.

Re:Proč nefunguje tento SQL dotaz
« Odpověď #22 kdy: 15. 10. 2018, 07:43:05 »
a) skuste si precitat co pise Vami odkazovany text: "vykonnostny rozdiel".
Já jsem to samozřejmě četl, a na rozdíl od vás až do konce. „Liší se pouze zápis. Smysl a provádění je stejné.“

b) pouzit Oracle syntax, ktora je syntakticky cukor ako agument, znaci, ze ocividne netusite o com pisete.
Ta Oracle syntax je starší, než JOIN ve standardu. Syntaktický cukr je naopak klíčové slovo ON ve standardu – v případě INNER JOIN se podmínka, která se za ON napíše, jenom pomocí AND připojí k ostatním podmínkám ve WHERE. V případě OUTER JOINu je to to samé, akorát se ta podmínka samozřejmě z INNER JOIN predikátu musí změnit na OUTER JOIN. K tomu JOINu se podmínka pomocí ON připojuje jenom kvůli přehlednosti, klidně tam můžete dát podmínku, která se spojovaných tabulek nijak netýká, a naopak klidně podmínku pro spojení tabulek můžete dát do WHERE.

c) ano, vami uvedene dve SQLka nemaju prakticky rozdiel, ale to sa samozrejme netyka toho na co reagujete.
Samozřejmě se to týká toho, na co reaguju. Ten příkaz po změně porovnání NULL hodnoty na IS NOT NULL je naprosto správně, oba následující dotazy jsou ekvivalentní a budou mít stejný prováděcí plán:

Kód: [Vybrat]
SELECT z.name, i.zkr
FROM Zam z
  LEFT JOIN Info i
    ON z.id_z=i.id_z
WHERE (i.datum > 1561939200 OR i.datum IS NULL);

SELECT z.name, i.zkr
FROM Zam z
  LEFT JOIN Info i
    ON z.id_z=i.id_z AND i.datum > 1561939200
;

lt

Re:Proč nefunguje tento SQL dotaz
« Odpověď #23 kdy: 15. 10. 2018, 11:00:47 »
Tie sqlka nie su rovnake ani nahodou .. kazdy moze vratit rozny pocet riadkov.

Ten druhy vrati celu mnozinu prvej tabulky, data z druhej vrati len podla outer join podmienky.
Ten prvy ale vrati z mnoziny prvej tabulky len tie, kedy nenajoinuje druhu, plus tie, ktore sice najoinuje, ale plati podmienka datum>{cislo}


Re:Proč nefunguje tento SQL dotaz
« Odpověď #24 kdy: 15. 10. 2018, 13:09:40 »
Máte pravdu. Ztratil jsem se v tom, co Petr vlastně chce. Pokud chce vypsat všechny zaměstnance, a k nim pouze novější informace, pokud existují, pak je to:

Kód: [Vybrat]
SELECT z.name, i.zkr
FROM Zam z
  LEFT JOIN Info i
    ON z.id_z=i.id_z AND i.datum > 1561939200
;

SELECT z.name, i.zkr
FROM Zam z, Info i
WHERE i.id_z (+) = z.id_z AND i.datum (+) > 1561939200;

Petr

Re:Proč nefunguje tento SQL dotaz
« Odpověď #25 kdy: 17. 10. 2018, 06:18:28 »
Koukám co se tu rozpoutalo po mém dotazu. Divím se té nevraživosti některých, buďte v pohodě. K dotazům a poznámkám, co zde zazněly.

Jedná se o databázi Oracle.

Ano, datum je unix timestamp, aplikace s ním pracuje takto, nevidím důvod proč ho takto neukládat i v databázi.

Co se týče velikosti písmen, je mým zvykem psát sql konstrukce velkými písmeny (SELECT), tabulky s velkými prvními písmeny a atributy malými. Databázi je to jedno a mě to pomáhá se lépe orientovat.

Databáze v mém dotazu zaručeně vrací jiné výsledky podle toho, zda podmínku na datum napíšu za ON nebo za WHERE a doufám, že je to zaručené a nějaký exekuční plán nemůže měnit náhodně vrácené výsledky.

Re:Proč nefunguje tento SQL dotaz
« Odpověď #26 kdy: 17. 10. 2018, 07:14:12 »
Databáze v mém dotazu zaručeně vrací jiné výsledky podle toho, zda podmínku na datum napíšu za ON nebo za WHERE a doufám, že je to zaručené a nějaký exekuční plán nemůže měnit náhodně vrácené výsledky.
Různé exekuční plány pro stejný dotaz samozřejmě musí vracet stejnou sadu záznamů. Když pouze přesunete zápis vaší podmínky z WHERE do ON u LEFT JOINU, změníte tu podmínku z INNER JOIN podmínky na LEFT JOIN podmínku. To jsou dvě různé podmínky, tedy (obecně) různé výsledky. Moje připomínka nebyla o tom, že můžete zaměňovat INNER JOIN a OUTER JOIN podmínky, to samozřejmě ne. Upozorňoval jsem, že nezáleží na tom, zda podmínku napíšete k ON nebo do WHERE – musí to ale být vždy ta stejná podmínka. Tedy pokud máte podmínku u LEFT JOIN … ON, musíte ji při přesunu do WHERE upravit na zápis LEFT JOIN podmínky ve WHERE. Ten ANSI SQL:99 zápis joinů (s klíčovým slovem JOIN) přidává pomocí příslušných klíčových slov informaci o případném OUTER JOINu přímo k tomu klíčovému slovu JOIN, takže se to neuvádí už přímo u predikátu – při přesunu do WHERE tedy musíte ten příznak, že jde o OUTER JOIN, přidat přímo k tomu predikátu.

Nejjeednodušší je to samozřejmě u INNER JOINů, protože ty jsou ve WHERE defaultní a není potřeba k nim přidávat žádný příznak, takže příslušný predikát můžete opravdu jen přesouvat volně mezi ON a WHERE bez jakýchkoli úprav.