0

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

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'

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

谢谢你的帮助

4

2 回答 2

1

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

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

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

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

用一个例子来说明:想想 Order_Header 和 Order_Line 表......

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

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

所以基表中的 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)
于 2018-05-22T21:47:46.007 回答
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'
于 2018-05-22T21:59:48.773 回答