Sql 尝试编写内部联接以过滤掉某些条件

Sql 尝试编写内部联接以过滤掉某些条件,sql,sql-server,inner-join,Sql,Sql Server,Inner Join,我目前正在努力进行一些加入,希望有人能对此有所启发。 我有三张桌子:A、B、C 表C列出了个人的姓名 表A列出了他们喜欢吃的食物 表B显示了一个人从C(我们的 系统是在没有外键的情况下建立的!我知道,这很痛苦!) 我试图写的是一个查询,它将返回表C中的值列表,其中显示不喜欢特定食物的个体…比如PFC 我有以下资料: select * from table_c c inner join table_b b on c.name = b.bValue inner join table_a a on

我目前正在努力进行一些加入,希望有人能对此有所启发。 我有三张桌子:A、B、C

  • 表C列出了个人的姓名
  • 表A列出了他们喜欢吃的食物

  • 表B显示了一个人从C(我们的 系统是在没有外键的情况下建立的!我知道,这很痛苦!)

我试图写的是一个查询,它将返回表C中的值列表,其中显示不喜欢特定食物的个体…比如PFC

我有以下资料:

select * from table_c c
inner join table_b b
on c.name = b.bValue
inner join table_a a
on b.aValue = a.number
where a.value not in('PFC')
我假设联接正在工作,但由于表A有多个值,因此将返回两个额外的行。如果其中一个连接显示了我不想看到的食物,是否可以不显示该客户

Table A
|---------------------|------------------|
|      Number         |     Value        |
|---------------------|------------------|
|          1          |       McDs       |
|---------------------|------------------|
|          1          |       KFC        |
|---------------------|------------------|
|          1          |       PFC        |
|---------------------|------------------|

Table B
|---------------------|------------------|
|      bValue         |     aValue       |
|---------------------|------------------|
|          John       |       1          |
|---------------------|------------------|

Table C
|---------------------|
|      Name           |
|---------------------|
|          John       |
|---------------------|

我也在使用SQL Server 2013,如果这有什么不同的话

一个选项是按名称聚合:

SELECT
    c.Name
FROM table_c c
INNER JOIN table_b b
    ON c.Name = b.bValue
INNER JOIN table_a a
    ON b.aValue = a.Number
GROUP BY
    c.Name
HAVING
    COUNT(CASE WHEN a.Value = 'PFC' THEN 1 END) = 0;
我们还可以尝试使用exists查询来表达这一点:

SELECT
    c.Name
FROM table_c c
WHERE NOT EXISTS (SELECT 1 FROM table_b b
                  INNER JOIN table_a a
                      ON b.aValue = a.Number
                  WHERE c.Name = b.bValue AND
                        a.Value = 'PFC');
不存在以下情况:

select * from table_c c
where not exists (
  select 1 from table_b b inner join table_a a
  on b.aValue = a.number
  where b.bValue = c.name and a.value = 'PFC'
)

在我的回答之后,你的预期结果是什么。