Sql 具有两个表的分层查询

Sql 具有两个表的分层查询,sql,database,oracle,function,hierarchical-query,Sql,Database,Oracle,Function,Hierarchical Query,我有一张名为AFP的桌子: 其中ID是主键,AFP_FUSION_ID是引用同一表的外键 此外,我还有一个名为寄存器的表: 在哪里 AFP_DESTINO is a foreign key that references to AFP.ID 我必须创建一个类似于参数10、20、30、40、50或90的函数,并返回相应的信息 如果函数接收到“10”,则函数必须从AFP_DESTINO=10的寄存器返回数据。 如果函数接收到“30”,则必须返回AFP_DESTINO=30、40或50的数据。 如果

我有一张名为AFP的桌子:

其中ID是主键,AFP_FUSION_ID是引用同一表的外键

此外,我还有一个名为寄存器的表:

在哪里

AFP_DESTINO is a foreign key that references to AFP.ID
我必须创建一个类似于参数10、20、30、40、50或90的函数,并返回相应的信息

如果函数接收到“10”,则函数必须从AFP_DESTINO=10的寄存器返回数据。 如果函数接收到“30”,则必须返回AFP_DESTINO=30、40或50的数据。 如果函数接收到“90”,则必须返回AFP_DESTINO=90、30、40、50的数据。 我必须使用Oracle,我有:

select * from (select * from registers
full outer join afp
on registers.AFP_DESTINO = afp.ID) where afp_destino = 30 or afp_fusion_id = 30
我必须对此进行改进,并在以后转换为函数。问题是,如果我用“30”代替“90”,当afp_destino=40或50时,我将没有数据

谁能帮帮我吗

更新:

我有此代码用于解决此问题:

select * from (select * from registers
full outer join afp
on registers.AFP_DESTINO = afp.ID)  connect by prior
afp_destino = afp_fusion_id start with afp_destino = 90

但会产生不一致,显示更多行。

欢迎使用堆栈溢出!这是一个你可以就你所写的软件所遇到的问题提问并获得答案的网站,但它不是一个为我做作业或为我做工作的网站。当你问一个问题时,你应该包括你写的代码和你得到的具体错误,或者你的程序产生的结果,以及对你期望的结果的解释。没有这一点,我们真的没有什么可以帮助你的。请编辑您的问题以显示您所做的工作,并告诉我们代码存在哪些问题。再次欢迎使用堆栈溢出!你好我没有解释清楚。我的想法是,如果我在AFP上添加一列,比如在AFP值100中插入'afp7',NULL并更新AFP集AFP\u FUSION\u ID=100,其中ID=90。之后,如果函数接收到“100”,它必须返回afp_destino=100、90、30、40或50的信息。我有这样的代码:select*from select*from寄存器完全外部连接寄存器上的afp.afp\u DESTINO=afp.ID通过先前的afp\u DESTINO=afp\u fusion\u ID连接以afp\u DESTINO=90开始,但生成不一致。出现更多行。
select * from (select * from registers
full outer join afp
on registers.AFP_DESTINO = afp.ID) where afp_destino = 30 or afp_fusion_id = 30
select * from (select * from registers
full outer join afp
on registers.AFP_DESTINO = afp.ID)  connect by prior
afp_destino = afp_fusion_id start with afp_destino = 90
/*Assuming you have hierarchical data upto three levels
Hope this query may help you only if i got your problem correctly*/
CREATE TABLE AFP
(
ID integer,
Name varchar2(4),
AFP_FUSION_ID number(3,0)
);
INSERT INTO AFP VALUES(10,'afp1',NULL);
INSERT INTO AFP VALUES(20,'afp2',NULL);
INSERT INTO AFP VALUES(30,'afp3',90);
INSERT INTO AFP VALUES(40,'afp4',30);
INSERT INTO AFP VALUES(50,'afp5',30);
INSERT INTO AFP VALUES(90,'afp6',NULL);
CREATE TABLE Registers
(
Full_Name varchar2(10),
AFP_DESTINO number(3,0)
);
INSERT INTO Registers VALUES('Name1',10);
INSERT INTO Registers VALUES('Name2',20);
INSERT INTO Registers VALUES('Name3',10);
INSERT INTO Registers VALUES('Name4',90);
INSERT INTO Registers VALUES('Name5',30);
INSERT INTO Registers VALUES('Name6',40);
WITH AFP_TEST
AS
(Select AFP_1_2.ID_1    as ID_1,
        AFP_1_2.ID_2    as ID_2,
        AFP_3.ID        as ID_3,
        AFP_FUSION_ID_1 as AFP_FUSION_ID_1
from  (select   AFP_1.ID as ID_1,
                AFP_2.ID as ID_2,
                AFP_1.AFP_FUSION_ID as AFP_FUSION_ID_1
                from AFP AFP_1 left outer join AFP AFP_2
        ON AFP_1.ID = AFP_2.AFP_FUSION_ID) AFP_1_2 left outer join AFP AFP_3
        ON AFP_1_2.ID_2 = AFP_3.AFP_FUSION_ID
)
select *
from registers full outer join AFP_TEST afp 
                on registers.AFP_DESTINO = afp.ID_1
where afp_destino = 30 or afp_fusion_id_1 = 90
/*Output : http://sqlfiddle.com/#!4/4291c/3 */