Sql 尝试编写内部联接以过滤掉某些条件
我目前正在努力进行一些加入,希望有人能对此有所启发。 我有三张桌子:A、B、CSql 尝试编写内部联接以过滤掉某些条件,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
- 表C列出了个人的姓名
- 表A列出了他们喜欢吃的食物
- 表B显示了一个人从C(我们的 系统是在没有外键的情况下建立的!我知道,这很痛苦!)
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'
)
在我的回答之后,你的预期结果是什么。