我正在尝试使用此代码在我的主表上进行左连接
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'
问题是查询结果是一个表格,其行数大于主表格,其中的条件是'条件'。我不明白我错过了什么
感谢您的帮助
答案 0 :(得分:0)
为什么会出问题? 结果只表明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和shipmentdate,订单仍然会有多行。我猜你的情况很相似。
基表中的1个*派生/行表中的2行给出了2条记录
1< 2这就是你现在的情况;如果这是一个1:M的关系,那对我来说就完全没问题了。
下面会给你一个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'