

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.
Jo jo, přepsal jsem to takhle:
Tohle mi zase vyplivne neuvěřitelných 468 záznamů pro jediného uživatele.
A to je poněkud moc - oproti požadovaným 16.
Ještě to upřesním, toto testuji jen pro aplikaci MGEO (limit na 'MGEO').
Ale plánuji to na všechny aplikace (celkem 4).
Jinak díky Honzo i za PSPad, tady na něm jedu já i kolega.
Dopln do WHERE podminku na aplikaci. Kdyz podminku na aplikaci odstranis, budes to mit pro vse
Pokud bys to nedelal na jednu aplikaci, byl by pocet v poradku.
Pokud je v tabulce prava seznam aplikaci, pak je to v poradku. Pokud ne (to bohuzel nevim), tak tam bude zaznamu moc.
Principem by melo byt:
seznam aplikaci x seznam uzivatelu (prvni 2 joiny) a pak pro kazdeho uzivatel a aplikaci (left outer join) dotahnes, zda ma pravo nebo ne - bud tam zazna je a pak si muzes precist pravo nebo neni, pak je opravneni.cokoliv is null
Tenhle dotaz je perfektní.
Funguje, ale má jednu chybku.
A to tu, že poslední - nejpodstatnější sloupec - maopravneni, má
pro všechny řádky hodnotu jen ANO.
A to i pro ty, které prokazatelně nemají.
EDITACE
BERU ZPĚT !
Ony tam ty hodnoty skutečně jsou. To se musím zeptat, ať si to hoši ujasní, jak to vlastně je.....
Uprav si ten vysledek na skutečnou hodnotu opravnění:
za predpokladu, ze opravneni je cislo
Na MS SQL by to slo misto celeho CASE takto:
Však jo, ale... ten Tvůj návrh:
Vrací narozdíl od mého předchozího příspěvku sice VŠECHNY práva, ale všechny jsou TRUE, tedy v tomhle případě opravneni.uzivatel_id.
Moje nervy z toho.....![]:(](https://static.poradna.net/images/smiley/evilworry.gif)
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).