即使在其他表中找不到任何表,也要从连接中的一个表中拉出所有行

时间:2016-10-21 16:08:36

标签: sql-server-2008

我有一个有近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为空。

2 个答案:

答案 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子句取消了左连接。