2015-01-05 141 views
0

我有这个表命名为"AFP"层次查询两个表

ID || NAME || AFP_FUSION_ID 
10 || afp1 || 
20 || afp2 || 
30 || afp3 || 90 
40 || afp4 || 30 
50 || afp5 || 30 
90 || afp6 || 

其中"ID" is a primary key"AFP_FUSION_ID" is a foreign key是同一个表引用。

另外我还这个表称为"Registers"

Full Name || AFP_DESTINO 
JOHN  || 10 
PETER  || 20 
ELENA  || 10 
MARCO  || 90 
DANIELA || 30 
FELIPE || 40 

其中

AFP_DESTINO is a foreign key that references to AFP.ID 

我必须创建具有类似参数的数(10,20,30,40的功能, 50或90)并且必须返回相应的信息。

  • 如果函数收到'10',函数必须返回数据from "REGISTERS" where AFP_DESTINO = 10
  • 如果收到'30'的函数必须返回数据where AFP_DESTINO = 30, 40 or 50
  • 如果函数收到'90',必须返回数据where 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 or 50我不会有数据。

有人可以帮我吗?

UPDATE:

我对解决这个验证码:

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 

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

+2

欢迎来到Stack Overflow!这是一个网站,您可以提问问题并获得有关您使用的软件遇到的问题的答案,但这不是“为我做作业”或“为我工作”网站。当你提出一个问题时,你应该包括你写的代码,你得到的具体错误或程序产生的结果,以及你期望的结果的解释。如果没有这些,我们可以做很多事情来帮助你。请编辑您的问题以显示您已完成的工作,并告诉我们代码存在哪些问题。再次,欢迎来到Stack Overflow! –

回答

0
/*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 */ 
+0

嗨!我没有解释清楚。想法是,如果我在“法新社”上添加一列,如“INSERT INTO AFP VALUES(100,'afp7',NULL)和UPDATE AFP SET AFP_FUSION_ID = 100 WHERE ID = 90.之后,如果函数接收 '100',它具有返回信息,其中afp_destino = 100,90,30,40或50 我有这样的代码: SELECT * FROM(SELECT * FROM寄存器 完全外部连接AFP 上registers.AFP_DESTINO = afp。ID)通过事先连接 afp_destino = afp_fusion_id以afp_destino = 90开始,但产生不一致。出现更多行。 – Felipe