Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno 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ě.

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
na opravu dotazu by som potreboval vidieť ako vyzerajú tie tabuľky, ale ten problém by mal riešiť RI…
Alibaba2 12.11.2014 11:17
Alibaba2
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č…
Flash_Gordon 12.11.2014 12:29
Flash_Gordon
Můžeš napsat nějaké příklady očekávaných řádků? Protože ať to čtu, jak to čtu, tak stejně nechápu, č…
Wikan 12.11.2014 12:37
Wikan
Jistě. Takovéto věci se nedají snadno popsat, ale já se nevzdávám. // EDIT Opravena chybka... Zákl…
Flash_Gordon 12.11.2014 12:48
Flash_Gordon
SELECT prava.*, uzivatele.*, maopravneni=case when not opravneni.Uzivatel_id is null then 'ANO' else…
Jan Fiala 12.11.2014 13:09
Jan Fiala
Teď jsem poskládal dotaz na základě vás obou, který částečně funguje. Vypadá následujícně: SELECT…
Flash_Gordon 12.11.2014 15:36
Flash_Gordon
Rikal jsi, ze v tabulce opravneni jsou i zaznamy pro uzivatele, kteri opravneni nemaji. To znamena,…
Jan Fiala 13.11.2014 07:55
Jan Fiala
No to jsme se trochu nepochopili. Podstatný je jeden detail. Tabulka PRAVA. To znamená, jsou tam ve…
Flash_Gordon 13.11.2014 10:48
Flash_Gordon
Pokud v tabulce opravneni neni zaznam pro pravo, ktere uzivatel mit nema, pak ti nemuze vyjizdet muj…
Jan Fiala 13.11.2014 11:01
Jan Fiala
Děkuji! Z tohohle se už dá dobře vycházet a já si to upravím. Pošlu nějaké $ na :beer: (podpořím P… poslední
Flash_Gordon 13.11.2014 11:24
Flash_Gordon

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:

[http://pc.poradna.net/file/view/20345-tabulky-jpg]

Příkaz, který nevede k výsledku vypadal i takhle:

SELECT *

FROM opravneni

full outer join uzivatele

ON uzivatele.id = opravneni.Uzivatel_id

full outer join prava prav

on prav.id = opravneni.pravo_id

where uzivatele.ID = 17001 and opravneni.aplikace = 'MGEO'

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 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...

SELECT prava.*, uzivatele.*, maopravneni=case when not opravneni.Uzivatel_id is null then 'ANO' else 'NE' end
FROM prava
join uzivatele on 1=1
left outer join opravneni ON uzivatele.id = opravneni.Uzivatel_id and opravneni.aplikace = 'MGEO'
where uzivatele.ID = 17001

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ě:

SELECT prava.id, prava.popis
FROM prava
LEFT JOIN opravneni o ON prava.id = o.pravo_id
LEFT JOIN uzivatele u ON o.Uzivatel_id = u.id
WHERE COALESCE(u.id, 17001) = 17001 
GROUP BY prava.id, u.id

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ů:

SELECT prava.id, prava.popis, case when not opravneni.Uzivatel_id is null then 'ANO' else 'NE' end maopravneni

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 = 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:

SELECT prava.*, uzivatele.*, case when not opravneni.Uzivatel_id is null then 'ANO' else 'NE' end maopravneni
FROM prava
join uzivatele on 1=1
left outer join opravneni ON uzivatele.id = opravneni.Uzivatel_id and opravneni.pravo_id = prava.id
where uzivatele.ID = 17001 and prava.aplikace='MGEO'

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