我有一个有近7000行和一个表的视图,我在左连接中认为我仍然会从视图中提取所有内容,并且只能在适用时将null插入到UNITCOST字段中。但是,它只会拉出匹配的行。以下是代码。
Select vto.*, vc.UNITCOST
From myView vto
LEFT JOIN VeryCost vc
ON vto.VI_ID = vc.VI_ID
Where (vc.VC_START_DATE BETWEEN '9/4/2016' AND '10/1/2016'
OR vc.VC_END_DATE BETWEEN '9/4/2016' AND '10/1/2016')
所以,我想要做的是从视图中选择所有行,并从VeryCost表中选择VI字段与日期匹配的UNITCOST值。当VI字段匹配但日期无效时,我希望这些行的UNITCOST为空。
答案 0 :(得分:2)
您的WHERE
条款限制了数据。要考虑来自vto
的不匹配项,请使用:
Select vto.*, vc.UNITCOST
From myView vto
LEFT JOIN VeryCost vc
ON vto.VI_ID = vc.VI_ID
Where
(vc.VI_ID is null)
or
(vc.VC_START_DATE BETWEEN '9/4/2016' AND '10/1/2016' OR vc.VC_END_DATE BETWEEN '9/4/2016' AND '10/1/2016')
编辑或者您可以在JOIN
条件中包含日期匹配,正如另一个答案所提到的那样。无论哪种方式,都不要做任何强制排除不匹配的事情。
答案 1 :(得分:1)
见推荐评论......
SELECT vto.*, vc.UNITCOST
FROM myView vto
LEFT JOIN VeryCost vc
ON vto.VI_ID = vc.VI_ID
AND (vc.VC_START_DATE BETWEEN '9/4/2016' AND '10/1/2016'
OR vc.VC_END_DATE BETWEEN '9/4/2016' AND '10/1/2016')
where子句否定了左连接。
首先进行连接,以便存在由连接生成的空记录。然后应用限制,因为VC只包括那些匹配的reocrds ...将出现NULL值。由于VC.Start_date或VC.End_date没有考虑空值,因此排除了空记录,因此where子句取消了左连接。