左连接子查询
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'
我正在尝试使用此代码
在我的主 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'