左连接子查询

Left join in subquery

我正在尝试使用此代码

在我的主 table 上进行左连接
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'

问题是查询结果是一个 table 行数大于主 table 与相同的地方 'condition'。我不明白我错过了什么

感谢您的帮助

为什么会出现问题? 结果仅表明您在 VBen:Vass(A)

之间存在 1:M(一对多)关系

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

  • 您缺少 table 之间的连接条件。
  • 你应该得到一个 min/max 你的日期而不是每个 benbanls
  • 的所有日期

为了更好地理解和回答我们需要知道 VBen 和 Vass 实际上代表什么;但简而言之,每个 VBEN

有多个 VASS(A)

举例说明:考虑 Order_Header 和 Order_Line tables...

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

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

so 1 in base table * 2 rows in derived/lines table 给我们 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)

很可能在主 table 上的一条记录的详细信息 table 中有多个对应方 table。

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

在我的数据库中:

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'