连接3个Oracle表的SQL语句
我查阅了几个网站和许多教程,试图确定最适合我的情况,虽然我发现了许多类似的解决方案,但没有确切的解决方案能满足我的需要。每次尝试时,我要么返回不正确的数据,要么重复,要么无法返回所需的所有字段。非常感谢您的帮助。谢谢,菜鸟 我有三个表,每个表共享一个SUBR_ID主键。在俗语中,我试图从TBL_SUBR_INDV_CARRY_中提取所有SUBR_ID和sub INDV_ID一对多的BENEFIT_CARRY_,其中GRP_ID='0G0000000',选择名字、姓氏、订户ID、个人ID和BENEFIT CARRY CARRY OVER。下面是引用的三个表和语句连接3个Oracle表的SQL语句,sql,oracle10g,inner-join,outer-join,Sql,Oracle10g,Inner Join,Outer Join,我查阅了几个网站和许多教程,试图确定最适合我的情况,虽然我发现了许多类似的解决方案,但没有确切的解决方案能满足我的需要。每次尝试时,我要么返回不正确的数据,要么重复,要么无法返回所需的所有字段。非常感谢您的帮助。谢谢,菜鸟 我有三个表,每个表共享一个SUBR_ID主键。在俗语中,我试图从TBL_SUBR_INDV_CARRY_中提取所有SUBR_ID和sub INDV_ID一对多的BENEFIT_CARRY_,其中GRP_ID='0G0000000',选择名字、姓氏、订户ID、个人ID和BENE
TBL_SUBR_INDV_CARRY_OVER:
SUBR_ID
INDV_ID
BENEFIT_CARRY_OVER
TBL_SUBR_GRP:
SUBR_ID
GRP_ID
TBL_SUBR_INDV:
SUBR_ID
INDV_ID
LNME
FNME
尝试1
select DISTINCT DCS2000.TBL_SUBR_GRP.SUBR_ID, DCS2000.TBL_SUBR_INDV.INDV_ID, LNME, FNME, GRP_ID, BENEFIT_YEAR, BENEFIT_CARRY_OVER
from DCS2000.TBL_SUBR_INDV_CARRY_OVER,
DCS2000.TBL_SUBR_GRP,
DCS2000.TBL_SUBR_INDV
where DCS2000.TBL_SUBR_INDV_CARRY_OVER.SUBR_ID = DCS2000.TBL_SUBR_INDV.SUBR_ID
and DCS2000.TBL_SUBR_INDV.SUBR_ID = DCS2000.TBL_SUBR_GRP.SUBR_ID
and DCS2000.TBL_SUBR_GRP.GRP_ID = '0G0000000'
and DCS2000.TBL_SUBR_INDV_CARRY_OVER.BENEFIT_CARRY_OVER > '0'
尝试2
select DCS2000.TBL_SUBR_INDV.SUBR_ID, DCS2000.TBL_SUBR_INDV.INDV_ID, DCS2000.TBL_SUBR_INDV.LNME, DCS2000.TBL_SUBR_INDV.FNME, DCS2000.TBL_SUBR_GRP.GRP_ID, DCS2000.TBL_SUBR_INDV_CARRY_OVER.BENEFIT_YEAR, DCS2000.TBL_SUBR_INDV_CARRY_OVER.BENEFIT_CARRY_OVER
from DCS2000.TBL_SUBR_INDV
join DCS2000.TBL_SUBR_GRP on (
where DCS2000.TBL_SUBR_INDV_CARRY_OVER.SUBR_ID = DCS2000.TBL_SUBR_INDV.SUBR_ID
and DCS2000.TBL_SUBR_INDV.SUBR_ID = DCS2000.TBL_SUBR_GRP.SUBR_ID
and DCS2000.TBL_SUBR_GRP.GRP_ID = '0G0000000'
and DCS2000.TBL_SUBR_INDV_CARRY_OVER.BENEFIT_CARRY_OVER > '0'
尝试3
SELECT LNME, FNME, SUBR_ID, INDV_ID
FROM DCS2000.TBL_SUBR_INDV
WHERE DCS2000.TBL_SUBR_INDV.SUBR_ID IN
(SELECT BENEFIT_CARRY_OVER
FROM DCS2000.TBL_SUBR_INDV_CARRY_OVER
WHERE DCS2000.TBL_SUBR_INDV_CARRY_OVER.SUBR_ID IN
(SELECT SUBR_ID
FROM DCS2000.TBL_SUBR_GRP
WHERE DCS2000.TBL_SUBR_GRP.GRP_ID = '0G0000000')
)
问题是,由于一对多的关系,所有三个表之间的简单联接将为您感兴趣的数据提供一个重复的行。连接必须为连接在一起的每一行生成一整行。而你想要的是一行 我经常发现,构建复杂查询最好是分部分完成 因此,首先查找所有具有感兴趣的值的ID,每个ID都有一行。因为我使用的是键盘,所以我会稍微缩短名称 从子RGRP中选择不同的子R\u id,其中grpid=0000006 然后把这个和下一张桌子结合起来 从subrindv中选择distinct indvid,其中subrid从subrgrp中选择distinct subr\u id,其中grpid=0000006 然后选择感兴趣的最后一行 从subrindv中选择结转,其中indvid在subrindv中选择不同的indvid,其中subrid在subrgrp中选择不同的subr\u id,其中grpid=0000006
另一种方法是使用GROUP BY将多行分组为一行。我假设出现重复是因为单个行可以有多个结转记录。因此,请尝试:
select i.SUBR_ID,
i.INDV_ID,
max(i.LNME) LNME,
max(i.FNME) FNME,
max(g.GRP_ID) GRP_ID,
o.BENEFIT_YEAR,
sum(o.BENEFIT_CARRY_OVER) BENEFIT_CARRY_OVER
from DCS2000.TBL_SUBR_GRP g
join DCS2000.TBL_SUBR_INDV i
on g.SUBR_ID = i.SUBR_ID
join DCS2000.TBL_SUBR_INDV_CARRY_OVER o
on i.SUBR_ID = o.SUBR_ID and i.INDV_ID = o.INDV_ID and o.BENEFIT_CARRY_OVER > 0
where g.GRP_ID = '0G0000000'
group by i.SUBR_ID,
i.INDV_ID,
o.BENEFIT_YEAR
请注意,单个表需要通过订户和单个ID与结转表连接;此外,福利结转等数字字段的值周围不应有引号。是结转表中的福利年,您想在查询结果中看到它吗?这非常有效。我能够验证每个个体的总数以进行比较。谢谢你抽出时间!