【问题标题】:Hierarchical Query with two tables具有两个表的分层查询
【发布时间】:2015-01-05 01:04:05
【问题描述】:

我有这张表名为 "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 时我将没有数据。

有人可以帮帮我吗?

更新:

我有这个代码来解决这个问题:

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

但会产生不一致,出现更多行。

【问题讨论】:

  • 欢迎来到 Stack Overflow!这是一个您可以就您编写的软件遇到的问题提出问题并获得答案的网站,但它不是“为我做作业”或“为我做我的工作”的网站。当您提出问题时,您应该包括您编写的代码和您遇到的具体错误或您的程序产生的结果以及您预期的结果的解释。没有这些,我们真的无能为力帮助您。请编辑您的问题以显示您所做的事情并告诉我们代码存在哪些问题。再次,欢迎来到 Stack Overflow!

标签: sql database oracle function hierarchical-query


【解决方案1】:
/*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 */

【讨论】:

  • 嗨!我没有解释清楚。想法是,如果我在“AFP”上添加一列,例如“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 registers full external join afp on registers.AFP_DESTINO = afp. ID)先连接 afp_destino = afp_fusion_id 以 afp_destino = 90 开头但会产生不一致。出现更多行。
猜你喜欢
  • 2017-06-03
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多