左连接子查询

时间:2018-05-22 21:24:21

标签: subquery left-join teradata-sql-assistant

我正在尝试使用此代码在我的主表上进行左连接

select distinct    VBen.BENF_NO_INDIV_BEN_BANLS as benbanls,
                               VBen.BENF_COD_SEXE AS Sexe,
                               VBen.BENF_DAT_NAISS AS DatNaiss,
                               VBen.BENF_DAT_DECES AS DatDec,
                               A.date_ch as date_chsld

from PROD.V_FICH_ID_BEN_CM AS VBen 

left   join  (select distinct VAss.BENF_NO_INDIV_BEN_BANLS as benbanls,
                              vass.BENF_DD_ADMIS_ASSU_MED as date_ch
               from Prod.V_ADMIS_ASSU_MED_PLAN_PRIOR_CM as vass ) as A   

   on VBen.BENF_NO_INDIV_BEN_BANLS =A. benbanls
   where Vben.BENF_DAT_NAISS>'2016-04-01' or Vben.BENF_DAT_DECES>'2011-04-01'

问题是查询结果是一个表格,其行数大于主表格,其中的条件是'条件'。我不明白我错过了什么

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

为什么会出问题? 结果只表明VBen:Vass(A)

之间的关系为1:M(一对多)

如果你没有1:M的关系,它应该是1:1然后......

  • 您缺少表格之间的加入条件。
  • 你的日期应该是最小/最大值,而不是每个benbanls的所有日期

为了更好地理解和回答,我们需要知道VBen和Vass实际代表什么;但简单来说,每VASS(A)

有多个VBEN

举例说明:想想Order_Header和Order_Line表......

Order_header包含(order_Number PK) Order_line包含(Order_Number,Order_Line PK)

订单可以有多条生产线,每条生产线都有自己的发货日期,有几件商品可能在同一批次的货物上运出。有些延期交货的地方在不同的日子里出现了。在这种情况下,即使我们在子查询中区分order_number和shipmentdate,订单仍然会有多行。我猜你的情况很相似。

基表中的1个*派生/行表中的2行给出了2条记录

1< 2这就是你现在的情况;如果这是一个1:M的关系,那对我来说就完全没问题了。

  • 也许你需要做一个最小或最大日期而不是一个独特的?
  • 如果不是,则缺少加入条件以建立1:1的关系
  • 也许你的期望是有缺陷的。

下面会给你一个1:1的关系,但我不确定这是你所追求的。

SELECT distinct VBen.BENF_NO_INDIV_BEN_BANLS as benbanls,
                VBen.BENF_COD_SEXE AS Sexe,
                VBen.BENF_DAT_NAISS AS DatNaiss,
                VBen.BENF_DAT_DECES AS DatDec,
                A.date_ch as date_chsld
FROM PROD.V_FICH_ID_BEN_CM AS VBen 
LEFT JOIN  (SELECT VAss.BENF_NO_INDIV_BEN_BANLS as benbanls,
                   Max(vass.BENF_DD_ADMIS_ASSU_MED) as date_ch
            FROM Prod.V_ADMIS_ASSU_MED_PLAN_PRIOR_CM as vass 
            GROUP BY VAss.BENF_NO_INDIV_BEN_BANLS) as A   
       on VBen.BENF_NO_INDIV_BEN_BANLS = A. benbanls
 WHERE (Vben.BENF_DAT_NAISS>'2016-04-01' 
    or Vben.BENF_DAT_DECES>'2011-04-01)

答案 1 :(得分:0)

主表上的记录详细信息表中可能有多个副本。

我在我的数据库上尝试你的场景得到了正确的结果。

在我的数据库中

select distinct p.PollId as PollId,
                p.Title AS Title,                               
                p.InsertDate AS DatDec,
                ps.date_ch as date_chsld
  from dbo.Poll AS p 
  left join  (select distinct pSt.PollId as pollId,
                              Max(pSt.InsertDate) as date_ch
               from dbo.PollStore as pSt 
           Group by pSt.PollId ) as ps   
on p.PollId =ps.pollId

正如您的查询一样:

select distinct    VBen.BENF_NO_INDIV_BEN_BANLS as benbanls,
                               VBen.BENF_COD_SEXE AS Sexe,
                               VBen.BENF_DAT_NAISS AS DatNaiss,
                               VBen.BENF_DAT_DECES AS DatDec,
                               A.date_ch as date_chsld    
please try this query     
from PROD.V_FICH_ID_BEN_CM AS VBen     
left   join  (select distinct VAss.BENF_NO_INDIV_BEN_BANLS as benbanls,
                              Max(vass.BENF_DD_ADMIS_ASSU_MED) as date_ch
               from Prod.V_ADMIS_ASSU_MED_PLAN_PRIOR_CM Group by VAss.BENF_NO_INDIV_BEN_BANLS as vass ) as A   
   on VBen.BENF_NO_INDIV_BEN_BANLS =A. benbanls
   where Vben.BENF_DAT_NAISS>'2016-04-01' or Vben.BENF_DAT_DECES>'2011-04-01'