

Oracle SQL - triviální dotaz
Dobré dopoledne.
Minule to nedopadlo úplně ideálně.
Tak jsem se inspiroval pořekadlem: Když jsi v nouzi, nejnápomocnější ruku najdeš na konci vlastního ramene.
A musím uznat, toto pořekadlo se mi v životě osvědčuje stále častěji.
Ale nyní zpět k technickému dotazu.
Vyredukoval jsem si poměrně jednoduchý SQL dotaz:
SELECT *
FROM opravneni
left join uzivatele
ON uzivatele.id = opravneni.Uzivatel_id
left join prava prav
on prav.id = opravneni.pravo_id
where uzivatele.ID = 17001 and opravneni.aplikace = 'MGEO'
Daný dotaz funguje supr, ale má jen jedinou vadu.
Vyjede mi výsledek, kde je vazba na tabulku PRAVA.
Data, která mi vyjedou mají hodnotu true.
Ale data která nevyjedou mají hodnotu false (myslím z tabulky PRAVA!).
Dokázal by někdo tenhle SQL dotaz patchnout tak, aby se zobrazily všechny sloupce
z tabulky PRAVA? A to tak aby tam třebas přibyl sloupec oprávnění - TRUE a když tam (nyní) není, tak false?
Vyjádřil jsem se doufám dostatečně jasně?
Pokud ne, rád doplním případné dotazy.
Díky za případnou pomoc. Hlavně bych chtěl poprosti Spidera, ten se v tomhle orientuje detailně.
na opravu dotazu by som potreboval vidieť ako vyzerajú tie tabuľky, ale ten problém by mal riešiť RIGHT JOIN. Prípadne skúste použiť FULL OUTER JOIN. Pekný opis ako fungujú joiny nájdete napríklad tu:
sql_join.asp
Díky za nápad, ale k výsledku zdá se nevede.
Pro jistotu to ještě rozepíšu přesněji.
Výsledkem současného dotazu jsou jen ty řádky s uživatelem, s oprávněními, která má povoleny.
Pokud on příslušná oprávnění nemá, tak se řádky nevypíší vůbec.
A mě jde zjednodušeně o to, aby se tam objevyly i ty řádky s oprávněními, která nemá.
Samozřejmě by tam měl být nějaký sloupeček navíc, kde bude T-True či F-False, abych se v tom vyznal(má/nemá).
Co se týče samotné struktury tabulek, tak ta vypadá takhle:
Příkaz, který nevede k výsledku vypadal i takhle:
Můžeš napsat nějaké příklady očekávaných řádků? Protože ať to čtu, jak to čtu, tak stejně nechápu, čeho chceš vlastně dosáhnout.
Jistě. Takovéto věci se nedají snadno popsat, ale já se nevzdávám.
// EDIT Opravena chybka...
Základem je tabulka PRAVA.
Tabulka PRAVA obsahuje všechny možné typy práv k různým aplikacím.
No a pak mám tabulku UZIVATELE.
Ta obsahuje všechny uživatele. Jejich oprávnění následně obsahuje tabulka OPRAVNENI.
Háček je ale v tom, že pokud uživatel právo má, tak v tabulce OPRAVNENI je vedeno.
Ovšem pokud uživatel právo nemá, tak tam vůbec vedený není!
A já potřebuji SQL dotaz, který vyjede uživatele i se VŠEMI PRÁVY.
To znamená, oproti stávajícímu dotazu tam budou navíc i ta práva a oprávnění, která nemá.
A bude samozřejmě nějak srozumitelně vyznačeno k čemu práva MÁ a k čemu Ne.
Určitě to jde nějak nesložitě naprogramovat i v Oracle SQL.
Ovšem můj znalostní záběr není neomezený.
Please...
podminka na aplikaci musi byt soucasti joinove podminky, jinak bys nedostal vysledek, ze uzivatel opravneni nema
prava na vsechny aplikace a uzivatele jsou formou kartezskeho soucinu (vsechny kombinace), protoze te zajima, kam vsude ma a nema uzivatel pravo
Syntaxe CASE je z MS SQL, na Oracle si to snad nejak prevedes.
Teď jsem poskládal dotaz na základě vás obou, který částečně funguje.
Vypadá následujícně:
A chtěl bych si vyjet tímto dotazem další přidružená data z tabulky uzivatele.
Ale pokud do prvního řádku přidám třebas sloupec u.full_name,
tak mě okamžitě seřve:
NOT A GROUP BY EXPRESSION
Navíc dotaz vytahuje jen přiřazená práva, ale nepřiřazená tam zase nejsou.
Dá se to nějak lehce opravit? Aby to zobrazovalo všechno, ideálně, aby vypadal první řádek vytažených sloupců:
Rikal jsi, ze v tabulce opravneni jsou i zaznamy pro uzivatele, kteri opravneni nemaji. To znamena, ze v nejakem sloupci je hodnota, ktera urcuje, zda uzivatel ma nebo nema pravo. Prozradis nam, jmeno sloupce v tabulce opravneni a hodnoty? Pak ti muzeme poradit - viz ma posledni odpoved.
No to jsme se trochu nepochopili.
Podstatný je jeden detail. Tabulka PRAVA.
To znamená, jsou tam vedeny všechny typy PRÁV, ale uživatel(é) nemají všechny přiřazeny v OPRÁVNĚNÍ.
To znamená - nejsou všechny spárovány s uživatelem.
Vyjádřil jsem se dost jasně?
Radši ještě jednou a jednodušeji:
V tabulce PRAVA jsou všechna práva a některá z nich mají uživatelé povoleny v Oprávnění.
A uživatel je tedy spárován jen s některými typy oprávnění.
Ale já potřebuji vyjet tabulku, kde budou VŠECHNA PRÁVA a to, zda konkrétní uživatel ho má či nemá.
Když si to vyjedu jednoduchým selectem * from oprávnění teď, tak vyjedou jen taková práva a oprávnění, která uživatel MÁ = jsou spárovány s uživatelem a oprávnění. Ale úplně tam chybí ta práva, která uživatel NEMÁ.
A já jen potřebuji vyjet všechna práva a oprávnění, která má a nemá do jedné tabulky( tedy všechna práva, která tabulka práva obsahuje + oprávnění povoluje).
Pokud to mám popsat ještě v nějakém detailu, rád jej připíšu.
Ach jo.
Pokud v tabulce opravneni neni zaznam pro pravo, ktere uzivatel mit nema, pak ti nemuze vyjizdet muj select se zapisem MApravo pro agendu a akci, kam pravo mit nema.
Jednoduse z tabulky opravneni se vrati pres LEFT OUTER JOIN zaznam null.
Upravil jsem podminku napojeni opravneni
Zkus si prosim tohle:
Děkuji!
Z tohohle se už dá dobře vycházet a já si to upravím.
Pošlu nějaké $ na
(podpořím PSPad, pc.poradnu jsem již nedávno také podpořil).