Rada s dotazem – Oracle – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Rada s dotazem – Oracle – Fórum – Programujte.comRada s dotazem – Oracle – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Drezir0
Duch
5. 5. 2015   #1
-
0
-

Ahoj, potřeboval bych poradit s následujícím příkladem:

Zjistěte jména trpaslíků, u kterých neměla Sněhurka evidováno do konce roku 2011, že je „Upovídaný“. Pro všechny tyto trpaslíky zjistěte, kolik vlastností u nich Sněhurka na přelomu roku 2011/2012 evidovala. Řádky na výstupu budou seřazeny podle jmen trpaslíků v abecedním pořadí sestupně. Jméno trpaslíka bude napsané velkými písmeny

 První část s upovídaností jsem vyřešil takto. Jména to vyhodí správná, avšak celkový počet vlastností správný není, protože je zde omezení where a já potřebuji připojit ke jménu, dalo by se říci to samé, ale bez použití omezovacích podmínek.

  
  select
    jmeno,
    count(*) as celkovy_pocet_vlastnosti
  from
    a_o_snehurce.trpaslici trp
  join
    a_o_snehurce.poznatky poz
  on
    trp.id_trpaslika = poz.id_trpaslika
  join
    a_o_snehurce.vlastnosti vl
  on
    poz.id_vlastnosti = vl.id_vlastnosti
  where
    poz.zaznamenano < '31.12.2011'
    and
    vl.vlastnost != 'Upovídaný'
  group by
    jmeno;

Správný dotaz, který vyhazuje celkový počet vlastností jsem vyřešil takto:
 

   select
    jmeno,
    count(vl.vlastnost) as celkovy_pocet_vlastnosti
  from
    a_o_snehurce.trpaslici trp
  join
    a_o_snehurce.poznatky poz
  on
    trp.id_trpaslika = poz.id_trpaslika
  join
    a_o_snehurce.vlastnosti vl
  on
    poz.id_vlastnosti = vl.id_vlastnosti
  group by
    jmeno;


Takže se jedná skoro o to samé, jak v prvním příkladě s jediným rozdílem použití omezujících podmínek. Teď mi jde ale o to, zobrazit jméno z prvního dotazu a počet vlastností z dotazu druhého.

Děkuji za vaši pomoc.

Nahlásit jako SPAM
IP: 188.75.128.–
Reklama
Reklama
peter
~ Anonymní uživatel
2551 příspěvků
6. 5. 2015   #2
-
0
-

Bylo by dobre rici i jak mas sestavene tabulky (idealne primo sql prikazy, aby si to clovek mohl testovat). Ja bych to resil takto:

vlastnosti - id_vlastnost, nazev
trpaslik - id_trpaslik, jmeno
tv - id_tv, id_trpaslik, id_vlastnost, datum

Podminky zadani mas tak, ze overujes vlastnosti. Takze zakladni dotaz bude z tabulky, kde jsou vlastnosti s trpasliky. K nemu pak pripojujes vsechno ostatni.

SELECT
  neco
FROM
  vt
WHERE
  vt.id_vlastnost!=cislo
-- pozor, nevim jestli je to ted spravne napsane pro oracle ani zaapisem groupconcat si nejsem jisty
SELECT
  i.id_trpaslik,
  b.jmeno,
  GROUP_CONCAT(", ",c.nazev)
FROM
  vt a
  LEFT JOIN trpaslik   b ON b.id_trpaslik=a.id_trpaslik
  LEFT JOIN vlastnosti c ON c.id_vlastnost=a.id_vlastnost
WHERE
  c.nazev!='upovidany'
GROUP BY
  a.id_trpaslikORDER BY
  b.jmeno ASC

Kazdopadne je jasne, ze takhle to bude desne pomale pro vic vlastnosti a obri tabulku (10.000 radku a vic), pac porovnat 10 znaku stringu 'upovidany' a 2 znaky integeru (id_vlastnost) je dost rozdil. Takze bych dovnitr dal poddotaz, ktery vybere id vlastnosti, ktere nemaji byt na seznamu a pak to porovnaval pres to id jako id_vlastnost NOT IN(2,3,5).

V druhe casti je pro tebe opet vychozi vt tabulka. Takze, kdyz pouzijes prvni cast jako poddotaz, ktery ti vytahne jen id, tak to uz dohromady nejak das, ne?
SELECT ... FROM vt ... WHERE id_trpaslik NOT IN (SELECT prvni dotaz)
Nebo tak nejak :)

Mozna by to slo prepsat jako
SELECT ... FROM vt a LEFT JOIN (SELECT prvni dotaz) b ON b.id_trpaslik=a._id_trpaslik... WHERE ...
a udelat podminku na "a" a soucasne aby id trpaslika z druhe nebylo null. To by melo byt rychlejsi, protoze se select provede jen jenou jako tabulka a ne opakovane. Ikdyz ted jsou sql vychytane, ze pri opakovani toho sameho ti vrati stejna data z pameti bez hledani.
 

Nahlásit jako SPAM
IP: 2001:718:2601:1f7:aca3:89...–
Drezir0
Duch
6. 5. 2015   #3
-
0
-

#2 peter
Ano, to vypadá dobře. Děkuji za odpověď

Nahlásit jako SPAM
IP: 78.128.155.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý