[SQL Oracle] Omezení "duplicitních" řádek po JOINu

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Marsian 21. 6. 2010 15:31

Ahoj všem chytrým hlavám tady na fóru. Už nějakou dobu se to snažím vyřešit a nic mě nenapadá. Snad mi někdo poradíte.

Mám tabulku uživatelů a pak druhou tabulku, kde jsou určité vlastnosti jejich vlastnosti. Mezi nimi existuje pochopitelně vazební tabulka.

Každý uživatel může mít víc těch vlastností v z druhé tabulce, takže pokud na uživatele joinuji tu vazební tabulku, každý uživatel se ve výsledku objeví vícekrát, podle toho, kolik má těch různých vlastností.
Já bych rád docílil toho, aby se ve výsledku objevil pouze jednou a to pokud má alespoň jednu z těch vlastností v druhé tabulce.

Tak snad jsem to dobře vysvětlil... ;-)

Předem děkuji za nápady...
Marsian
Junior

Odeslat příspěvekod Forty- 21. 6. 2010 15:38

Skus nam sem dat screenshot struktury tych tabuliek potom to mozno niekto zvladne presne. Neviem co presne vlastne chces selectnut. Z toho popisu ma napada riesenie nieco taketo :

Kód: Vybrat vše
select distinct meno,priezvisko from uzivatel
  where (select count(*) from vlastnosti where id = uzivatel.id) > 0;
Forty-
Junior
Uživatelský avatar

Odeslat příspěvekod gandor 21. 6. 2010 16:56

alebo to na konci groupnut cez pole, ktore pouzivas na join... Select distinct sa mi ale zda byt vhodnejsi :)
gandor
Mírně pokročilý

Odeslat příspěvekod logout 21. 6. 2010 17:33

Buďto
Kód: Vybrat vše
select distinct meno,priezvisko from uzivatel
  inner join vlastnosti on (vlastnosti.id = uzivatel.id)

nebo
Kód: Vybrat vše
select meno,priezvisko from uzivatel
  where exists (select id from vlastnosti where id = uzivatel.id)

nebo
Kód: Vybrat vše
select meno,priezvisko from uzivatel
  where id in (select id from vlastnosti)


Nejpřímější je druhej způsob, ale některý databáze by (v složitějším případě) počítali ten subselect pro každou řádku zvlášť (oracle doufam ne, ale jistě to tvrdit nemůžu) - je vždy
lepší psát subselecty tak, aby se v nich radši nevyskytoval odkaz na řádky z hlavního selectu
(zde uzivatel.id).
Já bych si vybral třetí způsob, ten bude rychlej snad všude.

PS: Select ... where (select count ...) > 0 jde samo taky, ale zaprvý je tam zbytečnej distinct,
zadruhý je to ekvivalentní zápisu s exists a složitější a je tam větší pravděpodobnost, že ten
subselect poběží pro každou řádku výsledku zvlášť, místo toho co by se převed na nějakou formu joinu.
Naposledy upravil logout dne 21. 6. 2010 18:47, celkově upraveno 1
logout
Junior

Odeslat příspěvekod Forty- 21. 6. 2010 17:53

jo ozaj ten distinct tam nemusi byt
Forty-
Junior
Uživatelský avatar

Odeslat příspěvekod Marsian 22. 6. 2010 09:14

Tak vám děkuji za hodnotné podněty. Myslím, že už jsem to vyřešil. Zcela zbytečně jsem tam cpal ten join, který tam vlastně vůbec být nemusí. Vždyť je to tak jednoduché. (Asi jsem byl trochu zaslepen tím, že jsem vycházel z dotazu, který už někdo špatně a krkolomně napsal přede mnou.)

;-)

P.S.:
logout píše:Buďto
Kód: Vybrat vše
select distinct meno,priezvisko from uzivatel
  inner join vlastnosti on (vlastnosti.id = uzivatel.id)


Tato konstrukce mi nefunguje, tak už mě to v podstatě napadlo předtím. Stále se vrací i "duplicitní" řádky. Možná je to nějaká specifická vlastnost Oraclu??? :?:
Marsian
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků