连接3个Oracle表的SQL语句

连接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

我查阅了几个网站和许多教程,试图确定最适合我的情况,虽然我发现了许多类似的解决方案,但没有确切的解决方案能满足我的需要。每次尝试时,我要么返回不正确的数据,要么重复,要么无法返回所需的所有字段。非常感谢您的帮助。谢谢,菜鸟

我有三个表,每个表共享一个SUBR_ID主键。在俗语中,我试图从TBL_SUBR_INDV_CARRY_中提取所有SUBR_ID和sub INDV_ID一对多的BENEFIT_CARRY_,其中GRP_ID='0G0000000',选择名字、姓氏、订户ID、个人ID和BENEFIT CARRY CARRY OVER。下面是引用的三个表和语句

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与结转表连接;此外,福利结转等数字字段的值周围不应有引号。

是结转表中的福利年,您想在查询结果中看到它吗?这非常有效。我能够验证每个个体的总数以进行比较。谢谢你抽出时间!