SQL SELECT beznadej

Honza Pazdziora adelton na informatics.muni.cz
Pátek Červenec 23 10:55:20 CEST 1999


> 
> Ano opet dalsi pokrok a pouceni. Chvili mi to trvalo pochopit co znamena
> UNION ALL a jak se pouziva. Pochopil jsem to tak, ze to spoji dva
> selecty

Ano.

> Nyni to mam asi takto:
> SELECT zakaznik.id, zakaznik.jmeno, count(*)
> FROM zakaznik, odbery
> WHERE zakaznik.jmeno=odbery.jmeno_zakaznika
> GROUP BY zakaznik.id, zakaznik.jmeno
> UNION ALL
> SELECT zakaznik.id, zakaznik.jmeno, '0' FROM zakaznik, odbery;
> 
> Pridal jsem vypis sloupcu, ktere potom budu chtit videt, coz na
> tomto priklade nevadi.
> Ted mi to dela to, ze mi to vybere nasledujici:
> id|jmeno           |count
> --+----------------+-----
>  1|pepa            |    4
>  2|josef           |    3
>  1|pepa            |    0
>  2|josef           |    0
>  3|vlada           |    0
>  4|honza           |    0

No, tak si to rozeberme -- chceme vybrat jen ty zaznamy z tabulky
zakaznik, ktere nemaji zadneho kamarada v tabulce odbery. Podle
pouzite databaze to muze byt

	SELECT zakaznik.id, 0
	FROM zakaznik, odbery
	WHERE zakaznik.id = odbery.id (+)	/* outer join */
		AND odbery.id IS NULL

nebo

	SELECT zakaznik.id, 0
	FROM zakaznik
	WHERE NOT EXISTS (			/* klauzule EXISTS */
		SELECT 1
		FROM odbery
		WHERE zakaznik.id = odbery.id

Proste musim v te druhe casti prihodit jen ty spravne vybrane zaznamy.

> Je videt, ze nepred vyselectuje to co ma, ale potom je jeste priradi
> i kdyz by je uvadet nemel.

No, ehm -- a jak jste mu rekl, ze je nema uvadet? ;-)

Muzete si s tim samozrejme vyhrat a udelat to i jako UNION ALL, tak
jak to mate, a hodit na to jeste jeden GROUP BY id a vybrat vzdycky
max(count). To taky jde. Ale potreba obenchmarkovat, co na danem
databazovem stroji dava nejlepsi vysledky.

------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
 make vmlinux.exe			-- SGI Visual Workstation Howto
Any spam sent to my email will be rewarded by complaint to your ISP abuse
  team and abuse teams of servers that relayed that message. It works.


Další informace o konferenci Databases