Ich habe die folgende Tabelle:Firebird (wie eine übergeordnete Kategorie mit SQL zu finden)
Ich möchte ein Verfahren schaffen, die in einer Kategorie nicht und gibt mir zurück Kategorie Eltern, wie dies :
ich habe ein Verfahren zu schaffen, bereits gelungen, aber es Daten nicht in der Art und Weise angezeigt werden ich wollte. Außerdem glaube ich, es gibt einen besseren Weg (vielleicht Rekursion?), Um die Aufgabe zu erfüllen, aber ich weiß nicht, wie man es implementiert. Hast du irgendwelche Hinweise?
--Database Query--
-- Creating Domain Boolean (didn't exist in FireBird) --
CREATE DOMAIN DBOOLEAN
AS Smallint
DEFAULT 0
NOT NULL
check (Value in (0,1));
-- Creating table --
CREATE TABLE TCATEGORIE
(CODE_CAT Char(5) NOT NULL,
NOM_CAT DNOM,
CUISINE_CAT DBOOLEAN DEFAULT 0,
FKCATPRINC_CAT Char(5),
PRIMARY KEY (CODE_CAT)
);
-- Inserted data --
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('B', 'Boissons', 0,null);
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('BS', 'Boissons froides', 0, 'B');
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('BV', 'Vins', 0, 'B');
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('BVR', 'Vin rouge', 0, 'BV');
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('BVB', 'Vin Blanc', 0, 'BV');
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('BVROS', 'Vin Rose', 0, 'BV');
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('BC', 'Boissons chaudes', 0, 'B');
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('V', 'Viande', 1, null);
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('VR', 'Viande Rouge', 1, 'V');
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('VB', 'Viande Blanche', 1, 'V');
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('P', 'Poisson', 1, null);
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('F', 'Fromage', 1, null);
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('S', 'Sauce', 1, null);
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('D', 'Dessert', 1, null);
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('DC', 'Dessert chaud', 1, 'D');
Insert Into TCATEGORIE
(CODE_CAT, NOM_CAT, CUISINE_CAT, FKCATPRINC_CAT)
values ('DG', 'Dessert glace', 1, 'D');
--Mein Procedure--
set term^;
create procedure CatParent (choix
type of column TCATEGORIE.CODE_CAT)
returns (CODE_CAT1 type of column TCATEGORIE.CODE_CAT,
CODE_CAT2 type of column TCATEGORIE.CODE_CAT,
CODE_CAT3 type of column TCATEGORIE.CODE_CAT,
NOM_CAT1 type of column TCATEGORIE.NOM_CAT,
NOM_CAT2 type of column TCATEGORIE.NOM_CAT,
NOM_CAT3 type of column TCATEGORIE.NOM_CAT)
as
begin
if(char_length(trim(choix))>=3)
then
select c.CODE_CAT, c2.CODE_CAT, c3.CODE_CAT,
c.NOM_CAT, c2.NOM_CAT, c3.NOM_CAT
from TCATEGORIE c
left join TCATEGORIE c2
on c.CODE_CAT=c2.FKCATPRINC_CAT
left join TCATEGORIE c3
on c2.CODE_CAT=c3.FKCATPRINC_CAT
where c.FKCATPRINC_CAT is null and
c3.code_cat=:choix into :CODE_CAT1, :CODE_CAT2, :CODE_CAT3,
:NOM_CAT1, :NOM_CAT2, :NOM_CAT3;
else if(char_length(trim(choix))=2)
then
select first 1 c.CODE_CAT, c2.CODE_CAT, c.NOM_CAT, c2.NOM_CAT
from TCATEGORIE c
left join TCATEGORIE c2
on c.CODE_CAT=c2.FKCATPRINC_CAT
left join TCATEGORIE c3
on c2.CODE_CAT=c3.FKCATPRINC_CAT
where c.FKCATPRINC_CAT is null and
c2.code_cat=:choix
into :CODE_CAT1, :CODE_CAT2,
:NOM_CAT1, :NOM_CAT2;
else
select first 1 c.CODE_CAT, c.NOM_CAT
from TCATEGORIE c
left join TCATEGORIE c2
on c.CODE_CAT=c2.FKCATPRINC_CAT
left join TCATEGORIE c3
on c2.CODE_CAT=c3.FKCATPRINC_CAT
where c.FKCATPRINC_CAT is null and
c.code_cat=:choix into :CODE_CAT1, :NOM_CAT1;
end^
set term;^
Clean & prägnant. Unglaublich, danke :) – SebastianJ
@SebastianJ Gern geschehen. Ich habe auch eine anoter Technik hinzugefügt. Siehe die Änderung. –