Autor | Zpráva | ||
---|---|---|---|
Nox_ Profil * |
#1 · Zasláno: 28. 11. 2007, 10:04:52
Ahoj, mám problém s dotazem na Dtb.
Dotaz: SELECT AutoNPC.Jmeno AS JmenoNPC, AutoNPC.Pohlavi AS PohlaviNPC, AutoNPC.Povaha AS PovahaNPC, AutoNPC.Nalada AS NaladaNPC FROM AutoNPC, TypNPC, Cas WHERE AutoNPC.Objekt LIKE 1 AND AutoNPC.Lokace LIKE 1 AND Cas.Hodina >= TypNPC.Vstavej AND TypNPC.Spi < Cas.Hodina , mi vrací zvojenné hodnoty, je to tím, že nemám spojené tabulky? Pokud ano, mohl bych mi nekdo prosim pomoct se spojeni, pokousel jsem se o to, ale pak mi nesly dotazy, takze to resim v selectu, kde primarni klic se rovna ID, které je nastaveno na serveru v sessions. |
||
Nox_ Profil * |
#2 · Zasláno: 28. 11. 2007, 10:05:14
A pokud ne, čím to může být?
|
||
Kajman_ Profil * |
#3 · Zasláno: 28. 11. 2007, 10:25:44
Asi že nemáte v podmínkách vazbu mezi AutoNPC a TypNPC.
|
||
Joker Profil |
#4 · Zasláno: 28. 11. 2007, 10:26:04
Nox_
je to tím, že nemám spojené tabulky? Spíš je to tím, že se dělá kartézský součin těch tabulek, tj. všechny kombinace. Příklad: když budu mít tabulku 2x2 s hodnotami (a,b), (c,d) a druhou tabulku 2x2 s hodnotami (1,2),(3,4), bude jejich kartézský součin: a,b,1,2 a,b,3,4 c,d,1,2 c,d,3,4 ...tzn. každá jednotlivá hodnota se tam vyskytuje dvakrát (obecně tedy "počet řádků té druhé tabulky"-krát) Mimochodem to může být dost výkonově náročné, už pokud bude mít každá tabulka třeba jen tisíc řádků, bude se SELECT dělat ze složené tabulky o miliardě řádků. Odhaduju, že správně by ten dotaz měl být: FROM AutoNPC a (LEFT?) JOIN TypNPC t ON nejakapodminka (LEFT?) JOIN Cas c ON dalsipodminka |
||
Nox_ Profil * |
#5 · Zasláno: 28. 11. 2007, 19:33:39
Takže způsob jak se vyhnou kartézskému součinu je používat spojení tabulek?
Chápu to správně? |
||
Nox_ Profil * |
#6 · Zasláno: 28. 11. 2007, 20:43:10
Tak jsem trochu studoval kauzale JOIN a podařilo se mi splodit tento dotaz:
SELECT AutoNPC.Jmeno AS JmenoNPC,AutoNPC.Pohlavi AS PohlaviNPC,AutoNPC.Povaha AS PovahaNPC,AutoNPC.Nalada AS NaladaNPC FROM AutoNPC JOIN TypNPC ON AutoNPC.Typ_NPC = TypNPC.Typ_NPC JOIN Cas ON TypNPC.Vstavej <= Cas.Hodina AND Cas.Hodina < TypNPC.Spi WHERE AutoNPC.Objekt LIKE 1 AND AutoNPC.Lokace LIKE 1 Tváří se, že je ok, tak uvidím :) |
||
Nox_ Profil * |
#7 · Zasláno: 28. 11. 2007, 21:10:27
Ještě mě zajímá, může dojít ke kartézkému součinu nejen při provádění dotazu, ale i při vkládání?
Na podobný problém jsem jednou narazil a nedokázal jsem si vysvetlit co to způsobuje... |
||
Kajman_ Profil * |
#8 · Zasláno: 28. 11. 2007, 21:41:47
Takže způsob jak se vyhnou kartézskému součinu je používat spojení tabulek?
Spojování tabulek je vždy kartézký součin. Podmínkami ale určujete pravidla a pokud máte podmínky 1:1 nebo 1:0 nemělo by se to projevit násobením počtu řádku. |
||
Časová prodleva: 16 let
|
0