【问题标题】:Left join in subquery子查询中的左连接
【发布时间】:2018-11-01 18:02:33
【问题描述】:

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

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'

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

感谢您的帮助

【问题讨论】:

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


【解决方案1】:

为什么会出现问题? 结果只是表明您在 VBen:Vass(A) 之间存在 1:M(一对多)关系

如果您没有 1:M 的关系并且应该是 1:1 那么...

  • 您缺少表之间的连接条件。
  • 您应该得到一个日期的最小值/最大值,而不是每个本班的所有日期

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

举个例子:想想 Order_Header 和 Order_Line 表...

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

一个订单可以有多行,每行可以有自己的发货日期,几件商品可能在同一天发货。一些延期交货的在不同的日子出去了。在这种情况下,即使我们在子查询中区分 order_number 和 shippingdate,订单仍然会有多行。我猜你的情况也差不多。

所以基表中的 1 *派生/行表中的 2 行给了我们 2 条记录

1

  • 也许您需要在日期上设置最小值或最大值而不是不同的日期?
  • 如果不是,您缺少建立 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)

【讨论】:

  • 谢谢你,这正是我所缺少的我应该在日期使用 min 因为一个 ID 可能有多个 date_ch
  • 别再瘦了,你需要与众不同的东西了。
【解决方案2】:

主表上的一条记录的明细表中可能有多个对应项。

我在我的数据库上尝试你的方案得到正确的结果。

在我的数据库中:

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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 2012-08-31
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多