Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno [MSSQL] SELECT

Ahoj potřebuju aby jste mi někdo zachránil život.. :)

ukol: Vyberte zákazníky, kteří si zarezervovali všechny lodě zelenné barvy
(Definovat SQL dotazem)

Tabulky
lod id_l,jmeno_l, typ_lodi,barva,pocet_mist
zakaznik id_z,jmeno_z,adresa
rezervace id_z,id_l, datum, cas

tzn. jestli bude lod id. jedna zelené barvy a lod id. dve zelené barvy a zakaznik č.1 bude mít v rezervaci lod č. 1 i č.2 aby dotaz vrátil zakaznika cislo jedna.. :)

Děkuji všem předem.. :)

Předmět Autor Datum
select distinct z.* from zakaznik z join rezervace r on r.idz = z.id join lod l on l.id = r.idl wher…
emem 20.02.2008 18:21
emem
Není to sice Mssql, ale možná to funguje i tam :-) select unique jmeno_z from lod, zakaznik, rezerv…
yorg 20.02.2008 18:23
yorg
Tá úloha sa mi nezdá celkom jednoznačne zadaná, ale ak chceš vybrať všetkých zákazníkov, ktorí si re…
los 20.02.2008 18:42
los
Já potřebuju zákazníka kteří si vybrali všechny zelené lodě ne jenom jednu.. :)
Marti 20.02.2008 18:49
Marti
Tak to je ten posledný select.
los 20.02.2008 19:12
los
Ještě jedna maličkost ještě bych k tomu poslednímu selektu potřeboval vybrat jméno zákazníka a já ne…
Martin M 20.02.2008 19:22
Martin M
SELECT * FROM zakaznik WHERE id_z IN ( SELECT id_z FROM rezervace LEFT JOIN lod ON lod.id_l=rezervac…
los 20.02.2008 19:32
los
Já to teda na konec upravil takhle,a výsledek máme stejný SELECT rezervace.id_z,z.jmeno_z FROM reze… poslední
Martin M 20.02.2008 19:37
Martin M

Tá úloha sa mi nezdá celkom jednoznačne zadaná, ale ak chceš vybrať všetkých zákazníkov, ktorí si rezervovali iba zelené lode, tak môžeš použiť niečo takéto:

SELECT id_z FROM rezervace
LEFT JOIN lod ON lod.id_l=rezervace.id_l
GROUP BY id_z
HAVING SUM(CASE barva WHEN 'zelena' THEN 0 ELSE 1 END)=0

prípadne:

SELECT DISTINCT id_z FROM rezervace
WHERE id_z NOT IN (
	SELECT id_z FROM rezervace
	LEFT JOIN lod ON lod.id_l=rezervace.id_l
	WHERE barva<>'zelena'
)

Alebo ak chceš vybrať zákazníkov, ktorí si rezervovali všetky dostupné lode zelenej farby, tak napr. takto:

SELECT id_z FROM rezervace
LEFT JOIN lod ON lod.id_l=rezervace.id_l
GROUP BY id_z, barva
HAVING barva='zelena' AND COUNT(*)=(SELECT COUNT(*) FROM lod WHERE barva='zelena')

Edit: Tie selecty v príspevkoch nado mnou vyberú zákazníkov, ktorí si rezervovali aspoň jednu zelenú loď (nie všetky).

Ještě jedna maličkost ještě bych k tomu poslednímu selektu potřeboval vybrat jméno zákazníka a já nevim jak to tam zakomponovat ptž hned bude LEFT JOIN na jinou tabulku když se budu snažit INNER JOIN zakaznik kvůli tomu jmenu :(

Já to teda na konec upravil takhle,a výsledek máme stejný

SELECT rezervace.id_z,z.jmeno_z FROM rezervace
LEFT JOIN lod ON lod.id_l=rezervace.id_l INNER JOIN zakaznik as z ON rezervace.id_z = z.id_z
GROUP BY rezervace.id_z, barva,z.jmeno_z
HAVING barva='zelená' AND COUNT(*)=(SELECT COUNT(*) FROM lod WHERE barva='zelená')

Dík.. Aspoň, že mám nějaký řešení. Dostal jsem teda info ze zhora že to mám dělat přes EXISTS někde ale fakt nevim jak to bylo myšlený.. :(

Zpět do poradny Odpovědět na původní otázku Nahoru