SQL Server:如何在WHERE子句中用IF ELSE或替代方法处理关联条件
解决LEFT JOIN后过滤未关联产品的问题
嘿,我完全懂你碰到的这个坑——当你把sm.magazyn = 2放在WHERE子句里时,那些在[HM].[SM]表中没有匹配记录的产品会被直接过滤掉。这是因为LEFT JOIN后,未匹配的行中sm相关字段的值都是NULL,而NULL和任何值做比较结果都是不成立的,所以这些行就被WHERE条件排除了。
要保留所有[HM].[TW]中的产品,同时只关联SM表中magazyn = 2的记录,你需要把sm.magazyn = 2这个条件从WHERE子句移到LEFT JOIN的ON子句里。这样在关联的时候就只会匹配符合条件的SM记录,而未匹配的TW产品依然会被保留下来,对应的SM字段为NULL。
修改后的查询语句如下:
select tw.id as id_product, tw.kod as tw_kod, tw.kod as ean, tw.nazwa as nazwa, sm.stanHandl as stan, cn.cena as cena_detaliczna from [HM].[TW] as tw join [SSCommon].[STElements] as elem on tw.znacznik = elem.Shortcut left join [HM].[SM] as sm on tw.id = sm.idtw and sm.magazyn = 2 -- 把条件移到这里 left join [HM].[CN] as cn on tw.id = cn.idpm where elem.Shortcut = '66' and elem.ElementKindId = '54' --and cn.typceny = 1 (如果这个条件也导致CN未匹配的行被过滤,同样可以移到LEFT JOIN的ON里) order by nazwa
另外补充一下:如果cn.typceny = 1这个条件也出现类似的问题(比如过滤掉没有CN表匹配的产品),你同样可以把它移到和CN表关联的ON子句中,逻辑和上面一样。
内容的提问来源于stack exchange,提问作者Vlad Seipa
相关产品推荐
相关产品推荐

