Proč nefunguje tento SQL dotaz

Petr

Proč nefunguje tento SQL dotaz
« kdy: 14. 10. 2018, 07:31:56 »
Proč mi nefunguje následující dotaz?
SELECT z.name, i.zkr
FROM Zam z LEFT OUTER JOIN Info i ON z.id_z=i.id_z
WHERE i.datum>1561939200 OR
      i.datum=NULL

Chtěl bych dosáhnout toho, aby se mi pro každého zam vypsalo info od zadaného data pokud existuje a pokud žádne info pro příslušné data neexistuje, tak aby se jednou vypsal samotný zam s tím, ze info bude null.

Když pominu nepodstatné, tak tabulka Zam má sloupce id_z a name (id_z je prim. klíč) a tabulka Info má sloupce id_z, datum a zkr (id_z a datum je prim. klíč).

Děkuji pěkně.


Petr

Re:Proč nefunguje tento SQL dotaz
« Odpověď #1 kdy: 14. 10. 2018, 07:42:17 »
Proč mi nefunguje následující dotaz?
SELECT z.name, i.zkr
FROM Zam z LEFT OUTER JOIN Info i ON z.id_z=i.id_z
WHERE i.datum>1561939200 OR
      i.datum=NULL

Chtěl bych dosáhnout toho, aby se mi pro každého zam vypsalo info od zadaného data pokud existuje a pokud žádne info pro příslušné data neexistuje, tak aby se jednou vypsal samotný zam s tím, ze info bude null.

Když pominu nepodstatné, tak tabulka Zam má sloupce id_z a name (id_z je prim. klíč) a tabulka Info má sloupce id_z, datum a zkr (id_z a datum je prim. klíč).

Děkuji pěkně.

Dotaz jsem napsal nejasně. Já vlastně vím proč to nefunguje. Nefunguje to proto, že se nejprve propojí tabulky, kde každý zam má nějaké info, takže tam žádné null není. Pak se uplatní filtr na datum a ten mi vyřadí všechny zam, kteří nemají info od příslušného data. Takže já bych potřeboval nejprve vyfiltrovat info podle data a pak teprve dělat left outer join, ale nevím jak říct, aby se nejprve uplatnilo where a až potom join.

Janci

Re:Proč nefunguje tento SQL dotaz
« Odpověď #2 kdy: 14. 10. 2018, 07:48:26 »
Lebo na NULL sa neporovnava cez =, ale operarorom IS NULL.

Petr

Re:Proč nefunguje tento SQL dotaz
« Odpověď #3 kdy: 14. 10. 2018, 07:51:45 »
Lebo na NULL sa neporovnava cez =, ale operarorom IS NULL.
Pravda, to jsem tady napsal blbě.

A už jsem přišel i na řešení svého problému, tu podmínku na datum musím napsat za ON místo do WHERE, tím ji vyfiltruji před spojením. Děkuji.

db

Re:Proč nefunguje tento SQL dotaz
« Odpověď #4 kdy: 14. 10. 2018, 08:54:43 »
Lebo na NULL sa neporovnava cez =, ale operarorom IS NULL.
Pravda, to jsem tady napsal blbě.

A už jsem přišel i na řešení svého problému, tu podmínku na datum musím napsat za ON místo do WHERE, tím ji vyfiltruji před spojením. Děkuji.

To IS NULL je jasné, ale přesunout podmínku za ON? Co to je za databázi?


Pavel...

Re:Proč nefunguje tento SQL dotaz
« Odpověď #5 kdy: 14. 10. 2018, 12:08:09 »
To IS NULL je jasné, ale přesunout podmínku za ON? Co to je za databázi?

Mozno nejaka obskurna DB to neda, ale je to uplne normalna vec.

Zakladna logika toho je v tom, ze ked robite povedzme full join, tak ked chcete v tej casti kde sa vam doplna "nic" robit podmienky, tak to vo WHERE klauzule robi pomerne blbo.
Uplne logicky to mozte strcit do ON, tak isto ako je tam ta podmienka na IDcka.

grgs

Re:Proč nefunguje tento SQL dotaz
« Odpověď #6 kdy: 14. 10. 2018, 12:17:07 »
Proč mi nefunguje následující dotaz?
SELECT z.name, i.zkr
FROM Zam z LEFT OUTER JOIN Info i ON z.id_z=i.id_z
WHERE i.datum>1561939200 OR
      i.datum=NULL

Chtěl bych dosáhnout toho, aby se mi pro každého zam vypsalo info od zadaného data pokud existuje a pokud žádne info pro příslušné data neexistuje, tak aby se jednou vypsal samotný zam s tím, ze info bude null.

Když pominu nepodstatné, tak tabulka Zam má sloupce id_z a name (id_z je prim. klíč) a tabulka Info má sloupce id_z, datum a zkr (id_z a datum je prim. klíč).

Děkuji pěkně.

to datum zrovna pustili z ústavu? uvozovky? nic?

ty tabulky vazne s velbloudi notaci?

do joinu rvat podminky na datum? ok no

Kit

Re:Proč nefunguje tento SQL dotaz
« Odpověď #7 kdy: 14. 10. 2018, 12:52:42 »
to datum zrovna pustili z ústavu? uvozovky? nic?
ty tabulky vazne s velbloudi notaci?
do joinu rvat podminky na datum? ok no

K čemu uvozovky, když se tam nepoužívá žádný string ani datum?

Kde je nějaká velbloudí notace? V ukázce žádnou nevidím.

grgs

Re:Proč nefunguje tento SQL dotaz
« Odpověď #8 kdy: 14. 10. 2018, 14:29:13 »
to datum zrovna pustili z ústavu? uvozovky? nic?
ty tabulky vazne s velbloudi notaci?
do joinu rvat podminky na datum? ok no

K čemu uvozovky, když se tam nepoužívá žádný string ani datum?

Kde je nějaká velbloudí notace? V ukázce žádnou nevidím.

pokud ma tazatel pod atributem datum schovany cislo ponozek, budiz, chtel bych to ve firme jako db architekta

predpokladam ze dalsi slovo v nazvu tabulky by zacinalo velkym pismenem.. pokud ne, bylo by to snad jeste horsi

Re:Proč nefunguje tento SQL dotaz
« Odpověď #9 kdy: 14. 10. 2018, 15:42:31 »
tu podmínku na datum musím napsat za ON místo do WHERE, tím ji vyfiltruji před spojením
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ží.

Problém v tom příkazu je jenom v tom porovnání s NULL hodnotou, kde se musí použít IS NULL a ne rovná se.

Kit

Re:Proč nefunguje tento SQL dotaz
« Odpověď #10 kdy: 14. 10. 2018, 15:48:03 »
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.

j

Re:Proč nefunguje tento SQL dotaz
« Odpověď #11 kdy: 14. 10. 2018, 16:06:51 »
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.

grgs

Re:Proč nefunguje tento SQL dotaz
« Odpověď #12 kdy: 14. 10. 2018, 16:13:49 »
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

agent

Re:Proč nefunguje tento SQL dotaz
« Odpověď #13 kdy: 14. 10. 2018, 16:23:31 »
To jsou datumy v té databázi opravdu uložené takhle hnusně jako sekundy od 1.1.1970?
Není pro programátora přehlednější použít raději něco jako date < '2019-07-10' (přípdně DATEDIFF(...) < 0) pokud neumí pro datumy přímo < <= > >= operátory?

Re:Proč nefunguje tento SQL dotaz
« Odpověď #14 kdy: 14. 10. 2018, 16:27:32 »
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.
Děkuji za potvrzení. Ano, v normální SQL databázi se to chová tak, že způsob zápisu dotazu vůbec nemá vliv na to, jak dotaz databáze vyhodnotí. To, jak přesně se dotaz provede – v jakém pořadí se budou načítat data pro jednotlivé tabulky, zda se použijí indexy nebo fullscan atd. – určuje plánovač dotazu. Je to asi ta největší přednost SQL databází a důvod, proč jsou tak úspěšné – databázový stroj tu optimalizaci dotazu v drtivé většině případů zvládá mnohem lépe, než člověk.

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.

Samozřejmě se to týká pořádných SQL databází, pokud si někdo napíše nějakou samo-domo databázi, která nemá žádný plánovač dotazů a jenom tupě rovnou z parseru načítá data, tam to na pořadí zápisu záviset může.