2015-01-05 142 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