Sql 选择除符合条件之外的所有行

Sql 选择除符合条件之外的所有行,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个条件,需要从主表中获取所有行。除了在子表中满足条件的行忽略它们之外,还要从主表中获取子表中不存在的行 以下是示例表和数据, 桌上食物 吧台 假设我需要表Foo中的所有Foo_名称,但表Bar中Foo_id的值不应为“Yes”。还获取不在Bar中但在Foo中存在的Foo_id 预期产量 Foo_Id Foo_Name 102 B 104 D 105 E 由于“A”和“C”的值为“是”,因此会将其过滤掉 这就是我试过的 Select F.Foo_id, F.Foo

我有一个条件,需要从主表中获取所有行。除了在子表中满足条件的行忽略它们之外,还要从主表中获取子表中不存在的行

以下是示例表和数据, 桌上食物

吧台

假设我需要表Foo中的所有Foo_名称,但表Bar中Foo_id的值不应为“Yes”。还获取不在Bar中但在Foo中存在的Foo_id

预期产量

Foo_Id  Foo_Name
102     B
104     D
105     E
由于“A”和“C”的值为“是”,因此会将其过滤掉

这就是我试过的

Select F.Foo_id, F.Foo_Name
From Foo F LEFT JOIN Bar B on F.Foo_id = B.Foo_id AND B.Bar_staus != 'Yes'
WHERE B.Foo_id IS NOT NULL
答案不应包含子查询

想到的内容不在或不存在:

仅在“是”行上加入,然后仅保留未找到匹配项的行:

select F.Foo_id, F.Foo_Name
from
    Foo F left outer join Bar B
        on F.Foo_id = B.Foo_id and B.Bar_status = 'Yes'
where B.Foo_id is null

@斯盖德斯在评论中描述了这个答案,但可能不清楚如何实施这个建议。如果B中可能有多个Yes值,那么您需要添加distinct。

您尝试过什么吗?有几种方法可以做到这一点-查找不存在…@sgedes,我已经添加了我所拥有的查询tried@sgeddes无论出于何种原因,OP都不允许使用子查询。您的查询非常接近-而不是不相等,您应该使用equals,而不是is not null use is null…@develenvonate连接将在Yes上匹配,因此Foo_id将不为null,并将被过滤:我们只想保留null,我的意思是,然后不匹配。@martin_vai7为什么对子查询施加限制,然后接受使用不匹配的答案以上的任何进一步评论?如预期效果,非常感谢@Gordon Linoff:,但我正在寻找没有解决方案的解决方案subquery@martin_vai7 . . . “你为什么要在一个问题上添加这样一个人为的条件?”戈登林诺夫我的第一个猜测是,这与家庭作业有关。不过我并没有否决你的答案。@GordonLinoff我不想按照我们的编码准则使用子查询。我们的组织不允许我们使用子查询,这就是我添加条件的原因。我也没有否决你的回答,非常感谢shawnt00和sgedes,一切如期进行,
Select F.Foo_id, F.Foo_Name
From Foo F LEFT JOIN Bar B on F.Foo_id = B.Foo_id AND B.Bar_staus != 'Yes'
WHERE B.Foo_id IS NOT NULL
select f.*
from foo f
where not exists (select 1
                  from bar b
                  where b.foo_id = f.foo_id and b.bar_status = 'Yes'
                 );
select F.Foo_id, F.Foo_Name
from
    Foo F left outer join Bar B
        on F.Foo_id = B.Foo_id and B.Bar_status = 'Yes'
where B.Foo_id is null