选择除条件匹配的所有行

时间:2016-03-08 19:06:29

标签: sql sql-server sql-server-2012

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

以下是样本表和数据, 表 Foo

Foo_Id  Foo_Name
101        A
102        B
103        C
104        D
105        E


Bar_Id  Foo_id  Bar_Status
21        101    Yes
22        101    No
23        102    No
24        103    Yes
25        103    No
26        103    NA
27        104    No
28        104    NA

假设我需要表 Foo 中的所有Foo_name,但表 Bar 中的Foo_id值不应为“是”。还要获取中不存在但出现在 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

答案不应包含子查询

1 个答案:

答案 0 :(得分:0)

仅加入行,然后只保留那些找不到匹配项的行:

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

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