Nesmyslný výsledek vracený LEFT JOIN   zodpovězená otázka

SQL, Databáze

Zdravím, prosím o pomoc s následujícím dotazem. Něco v něm soustavně přehlížím a nemůžu přijít na to co to je.

Můj požadavek:

Mám 3 tabulky.

-v první (označena c) je seznam uživatelů kteří se zalogovali. Pro každého zalogovaného uživatele/den je v tabulce právě jeden záznam ke konkrétnímu dni (nemůže se stát že by například pro datum 19.2.2009 byl v tabulce 2x uživatel Jan Dědek)

-ve druhé tabulce (označena p) je přehled toho co daný uživatel v daném dni udělal a je zde i bodové hodnocení. Právě sloupec body potřebuji pro každého uživatele/den sečíst a přiřadit ke jménům načtených z tabulky jedna

-třetí tabulka (označena n) má stejnou strukturu jako tabulka 2 a potřebuji získat stejná data


SELECT c.id,c.datum,c.jmeno,c.tym,c.poznamka,
       sum(p.body) AS [Body 1],sum(n.body) AS [Body 2]

FROM tb_denni_statisiky_vystupy c

LEFT OUTER JOIN tb_body_1 p ON
				p.jmeno=c.jmeno AND
				p.tym=c.tym AND 
				p.datum_odeslani=c.datum AND 
				p.stav=2
LEFT OUTER JOIN tb_body_2 n ON
				n.jmeno=c.jmeno AND
				n.tym=c.tym AND 
				n.zpracovano_datum=c.datum AND 
				n.stav=2

WHERE c.datum>='1.2.2009' AND c.datum<='2.19.2009'

GROUP BY c.id,c.datum,c.jmeno,c.tym,c.poznamka''

Porovnání týmů je pouze z důvodu ošetření velmi nepravděpodobného případu, kdy by vedoucí přesunul uživatele během dne z týmu do týmu.

Potřebuji načíst všechny data z první tabulky(c) a k nim přiřadit data ze zbylých dvou tabulek (pokud v nich záznam odpovídající kriteriím existuje).

Problém je že mi dotaz vrací nesmyslná čísla. Ale je zajímavé že pokud provedu propojení pouze s jednou tabulkou (buď p nebo n) vrácená data jsou správná.

Zřejmě španě chápu co se s čím spojuje pokud je zde více tabulek.

Dotaz spouštím na SQL serveru 2000

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zákeřná chyba. Druhým joinováním totiž připojujete řádky k tabulce, která může obsahovat více záznamů pro jeden den (pokud v první tabulce jich pro jeden den více je) a najoinujete tak hodnotu vícekrát. Řešením je například seskupení dat tabulek s body ještě před joinováním:

SELECT c.id,c.datum,c.jmeno,c.tym,c.poznamka,
sum(body1) AS [Body 1],sum(body2) AS [Body 2]

FROM tb_denni_statisiky_vystupy c

LEFT OUTER JOIN 
(
	select *, body as body1, null as body2 from tb_body1
	union all select *, null as body1, body as body2 from tb_body2
) p ON
p.jmeno=c.jmeno AND
p.tym=c.tym AND 
p.datum_odeslani=c.datum AND 
p.stav=2

WHERE c.datum>='1.2.2009' AND c.datum<='2.19.2009'

GROUP BY c.id,c.datum,c.jmeno,c.tym,c.poznamka

Všimněte si, že kvůli identifikaci z jaké tabulky body pocházejí jsem využil konstrukce, kde jsou sloupce shodné, jen přidávám další dva body1 a body2:

	select *, body as body1, null as body2 from tb_body1
	union all select *, null as body1, body as body2 from 
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak už mi to funguje, chvíli mi trvalo než jsem se v tom zorientoval:)

Moc děkuju za radu, na tohle bych zřejmě jen tak nepřišel (hlavně bych nepřišel na to kde je chyba) :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback