SQL Server内部联接排除结果不起作用

时间:2016-08-16 05:10:58

标签: sql sql-server join

我的数据库中有2个表t_recipe和t_recipe_ingredient有1对多关系意味着一个食谱可以有多个成分。我必须给出一个过滤条件,它应该给我含有成分或排除成分的食谱。

对于包含我创建了以下查询,它工作正常:

blog = Nested(
    properties={
        'id': Integer(),
        'rating': Integer()
    }
)

但是对于排除我得到的食谱有成分110,111然而它不应该返回它们,我认为这是由于内部连接,其中包括所有其他成分和返回食谱:

select * 
from t_recipe r 
join t_recipe_ingredient rexc  ON r.RecipeID = rexc.RecipeID 
where r.RecipeTypeID = 1 
  and rexc.IngrId in (110, 111)    

3 个答案:

答案 0 :(得分:3)

我认为你必须使用not exists排除配方

select * from t_recipe r 
    where r.RecipeTypeID = 1
    and not exists(
     select null 
     from t_recipe_ingredient 
     where ingrid in(110, 111) and r.RecipeID = rexc.RecipeID 
   )

答案 1 :(得分:2)

如果你想要没有这些成分的食谱,这里有一种方法:

select r.*
from t_recipe r left join
     t_recipe_ingredient rexc 
     on r.RecipeID = rexc.RecipeID and rexc.IngrId in (110, 111)
where r.RecipeTypeID = 1  and rexc.RecipeID is null;

答案 2 :(得分:0)

尝试以下方法:

select * 
from t_recipe r 
join t_recipe_ingredient rexc WITH (NOLOCK) ON r.RecipeID = rexc.RecipeID AND rexc.IngrId not in (110, 111)    
where r.RecipeTypeID = 1