代码之家  ›  专栏  ›  技术社区  ›  Houssem Missaoui

子查询中的左联接

  •  -1
  • Houssem Missaoui  · 技术社区  · 6 年前

    我正在尝试使用此代码在主表上执行左联接

    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 回复  |  直到 6 年前
        1
  •  0
  •   xQbert    6 年前

    为什么会有问题? 结果只表明vben:vass(a)之间有1:m(一对多)的关系。

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

    • 表之间缺少联接条件。
    • 你的约会时间应该是最短/最长,而不是每个本巴的所有日期。

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

    举例说明:考虑订单标题和订单行表…

    订单头包含(订单号pk) 订单行包含(订单号、订单行pk)

    一个订单可以有多个行,每行可以有自己的发货日期,多个项目可能在同一个发货/天中发货。有一些缺货货在另一天就出去了。在这种情况下,即使我们在子查询中区分订单号和发货日期,订单仍然有多行。我想你的情况差不多。

    所以基表中的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)
    
        2
  •  0
  •   Hüseyin Burak Karadag    6 年前

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

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

    在我的数据库中:

    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'