Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 2. 10. 2015 11:39:12

hdplot
Člen
Registrace: 18. 2. 2015
Příspěvků: 115

Databáze typu "Kusovník" II - výpis doplňku množiny záznamů - VYŘEŠENO

Opět se obracím na radu s "Kusovníkem". Databáze se pomalu plní a vyvstal problém v ní hledat podle určitého kriteria. Nejprve popíši současný stav:


Databáze obsahuje 2 tabulky. První tabulka - "Vykresy" - každý záznam obsahuje data pro jeden daný výkres - ID, Název, Číslo, Autor, Datum .... Druhá tabulka "Kusovnik" obsahuje vazby mezi výkresy - každý záznam má pouze 3 položky - ID, IDSes, IDDet. IDSes odpovídá nějakému konkrétnímu ID z tabulky "Vykresy" a určuje, že tento výkres je sestavou a rozpadá se na několik dalších položek. IDDet odpovídá také nějakému konkrétnímu ID z tabulky "Vykresy" (je jiné než IDSes daného záznamu) a určuje, který jiný výkres ze všech výkresů je podsestava k nadřazenému výkresu.


Z uvedeného je zřejmé, že v IDDet se může vyskytovat číslo (výkres), který je podřízený nějaké vyšší sestavě, ale toto číslo se v jiném záznamu může vyskytovat také v IDSes - tedy je to také sestava, která napadá do jiné vyšší sestavy. Naopak se může vyskytovat číslo ID v tabulce "Vykresy", které v tabulce "Kusovník" není vůbec nikde uvedeno - tedy tento výkres ještě nebyl v Kusovníku zpracován.


Potřebuji sestavit 3 nezávislé dotazy, které budou kombinovat data z tabulek "Vykresy" a "Kusovnik" a vypíší buďto všechny sestavy, nebo všechny detaily, nebo všechny nezpracované výkresy.


a) Všechny sestavy - to je jasné - vše, co se vyskytuje v IDSes - tento dotaz je triviální
b) Všechny detaily - vše, co JE v IDDet(Kusovnik) ale SOUČASNĚ NENÍ také v nějakém jiném záznamu IDSes(Kusovnik) - Metodou pokus-omyl jsem nakonec sestavil dotaz, který snad funguje (SELECT "Kusovnik"."IDDet" FROM "Kusovnik" AS "Kusovnik_1", "Kusovnik" WHERE "Kusovnik_1"."IDDet" = "Kusovnik"."IDSes" GROUP BY "Kusovnik"."IDDet")
c) Všechny nezařazené - vše, co se vyskytuje v ID(Vykresy), ale současně se nevyskytuje ani v IDSes(Kusovnik) ani v IDDet(Kusovnik) - to vím, ale nejsem schopen tento dotaz správně formulovat :-(


Na závěr uvedu příklad:


ID(Vykresy) = 1,2,3,4,5,6
Kusovnik = (1,2),(1,4),(2,3),(2,4)


Tedy dotaz Sestava vypíše 1,2, dotaz Detail vypíše 3,4 a dotaz Nezarazene vypíše 5,6


Díky za radu

Editoval hdplot (6. 10. 2015 10:26:33)

Offline

#2 2. 10. 2015 12:19:39

student
Člen
Registrace: 27. 2. 2006
Příspěvků: 112

Re: Databáze typu "Kusovník" II - výpis doplňku množiny záznamů - VYŘEŠENO

Opäť.. chcelo by to vidieť nejakú ukážku s tými existujúcimi dotazmi.
Ja by som sa pokúsil "obrátiť" tie dva dotazy opačne - teda vylúčiť údaje, ktoré obsahujú a nech zobrazí zvyšné... ale to je len úvaha. Resp. by som sa snažil dostať k výsledku viacerými dotazmi, pričom v každom nasledujúcom by som použil výsledky (odkaz) na predchádzajúci dotaz.

Offline

#3 2. 10. 2015 12:27:56

hdplot
Člen
Registrace: 18. 2. 2015
Příspěvků: 115

Re: Databáze typu "Kusovník" II - výpis doplňku množiny záznamů - VYŘEŠENO

No ukázka na detail byla uvedena, tak zopakuji a přidám sestavu. Ukázky na dva funkční dotazy:


Pro sestavu: SELECT "IDSes" FROM "Kusovnik" GROUP BY "IDSes"


Pro detail:  SELECT "Kusovnik"."IDDet" FROM "Kusovnik" AS "Kusovnik_1", "Kusovnik" WHERE "Kusovnik_1"."IDDet" = "Kusovnik"."IDSes" GROUP BY "Kusovnik"."IDDet"

Offline

#4 2. 10. 2015 12:41:33

student
Člen
Registrace: 27. 2. 2006
Příspěvků: 112

Re: Databáze typu "Kusovník" II - výpis doplňku množiny záznamů - VYŘEŠENO

Ten detail som si všimol, ale myslel som ukážku celej databázy (mám "grafickú pamäť" a mám radšej, ak vidím objekty ako len sql príkaz)

Offline

#5 2. 10. 2015 12:54:58

hdplot
Člen
Registrace: 18. 2. 2015
Příspěvků: 115

Re: Databáze typu "Kusovník" II - výpis doplňku množiny záznamů - VYŘEŠENO

OK - pošlu vzorovou databázi na Váš mejl

Offline

#6 5. 10. 2015 13:54:41

hdplot
Člen
Registrace: 18. 2. 2015
Příspěvků: 115

Re: Databáze typu "Kusovník" II - výpis doplňku množiny záznamů - VYŘEŠENO

Tak jsem o něco postoupil. ale zatím u cíle nejsem. Zatím mám stav, že mám tabulku "Vykresy", která obsahuje čísla 1,2,3,4,5,6 - (viz. předchozí komunikaci) a dotaz, "Pouzito" který vygeneruje čísla 1,2,3,4 - tedy výkresy, které se objevují kdekoliv v tabulce "Kusovník". Zbývá poslední - jak formulovat dotaz, který z těchto dvou tabulek vygeneruje čísla, které se NEOBJEVÍ v té druhé - tedy jak napsat negaci porovnání. Není to bohužel znak <>, protože ten vypíše opakovaně sadu tak, že vždy jedno číslo chybí, ale v konečném výpisu jsou tam všechna čísla, takže ani funkce GROUP pak nepomůže - výsledkem jsou vždy všechna čísla 1 až 6.

Offline

#7 6. 10. 2015 10:29:25

hdplot
Člen
Registrace: 18. 2. 2015
Příspěvků: 115

Re: Databáze typu "Kusovník" II - výpis doplňku množiny záznamů - VYŘEŠENO

Takže jsem to doladil - odpovím si tedy sám, snad se to bude hodit i někomu dalšímu. Poslední problém byl napsat dotaz, který porovná dvě tabulky - velkou množinu "Vykresy" a její podmnožinu "Kusovnik" a vypíše ty, které se v "Kusovníku" NEVYSKYTUJÍ tedy doplněk těchto dvou množin. Postupoval jsem - viz předchozí komunikace a následně pak takto:


Jedná se o porovnání tabulky "Vykresy" (obsahuje 1,2,3,4,5,6) a "DetASes" (obsahuje použité výkresy 1,2,3,4) tak, aby výsledkem bylo "Nezarazeno" (bude obsahovat 5,6). napsal jsem si pomocný dotaz "AnoNe" jehož výstupem je tabulka s hodnotami 1 až 6 tedy všechny výkresy a další pomocný sloupec který obsahuje buďto opět číslo výkresu (pokud je výkres obsažen) nebo hodnotu NULL, pokud výkres obsažen není. Dotaz vypadá takto: SELECT "Vykresy"."IDVykr", "DetASes"."ID_DS" AS "NOT-sloupec" FROM { OJ "DetASes" RIGHT OUTER JOIN "Vykresy" ON "DetASes"."ID_DS" = "Vykresy"."ID_Vykr" }, výsledkem jsou záznamy (1,1) (2,2) (3,3) (4,4),(5,NULL),(6,NULL)


Následně pak na takto vzniklou tabulku aplikuji další dotaz, hodnotu NULL převedu na nějaké číslo, které se určitě nepotká s čísly výkresů (pro nás 1 až 4), převádím tedy na číslo 99999 a vypíšu pouze záznamy, které obsahují hodnotu NULL - tedy teď už hodnotu 99999. Dotaz pak vypíše tabulku, ve které budou pouze záznamy, jejichž číslo výkresu je 99999 - tedy ty, které nejsou zahrnuty. Tento poslední dotaz vypadá takto:  SELECT "Vykresy"."ID_Vykr", NVL( "NOT-sloupec", 99999 ) FROM "AnoNe", "Vykresy" WHERE "AnoNe"."ID_Vykr" = "Vykresy"."ID_Vykr" AND NVL( "NOT-sloupec", 99999 ) = '99999'


A je to. Jak prosté :-))))

Offline

#8 7. 10. 2015 07:44:27

student
Člen
Registrace: 27. 2. 2006
Příspěvků: 112

Re: Databáze typu "Kusovník" II - výpis doplňku množiny záznamů - VYŘEŠENO

gratulujem, toto použijem ako učebný materiál ... pre seba.

Offline

#9 16. 10. 2015 13:15:14

hdplot
Člen
Registrace: 18. 2. 2015
Příspěvků: 115

Re: Databáze typu "Kusovník" II - výpis doplňku množiny záznamů - VYŘEŠENO

Jenom ještě upřesním malou chybku, která se vloudila do předchozího popisu. Výpisem výkresů z již hotové obsáhlejší databáze "Kusovník" jsem zjistil, že dotaz na výpis detailu je konstruován chybně, dává chybné výsledky a protože se z něj vychází i pro dotaz "Nezarazene", přenáší se chyba i sem. Původní výše uvedený dotaz pro detail:  SELECT "Kusovnik"."IDDet" FROM "Kusovnik" AS "Kusovnik_1", "Kusovnik" WHERE "Kusovnik_1"."IDDet" = "Kusovnik"."IDSes" GROUP BY "Kusovnik"."IDDet" je tedy nutné opravit.


Opravou je to, že i na vyfiltrování detailů z kusovníku se musí použít konstrukce přes nepoužité výkresy, tedy dva vnořené dotazy, kdy jeden vypíše v prvním sloupci detaily a v druhém sestavy, nebo hodnotu NULL a dále pak druhý dotaz, který z těchto hodnot převede hodnoty NULL na 99999 a tyto pak vyfiltruje do konečné tabulky. Takto použité výsledky se pak dále využijí v dotazech pro nezařazené výkresy a už to funguje správně.

Offline

Zápatí