SQL联接问题的查询结果出现问题。基本问题

SQL联接问题的查询结果出现问题。基本问题,sql,Sql,我有两个表格,布局如下 人员: 喜欢: 我试图从上面两个表中列出那些不喜欢啤酒的人的名字,使用justjoins,我不允许使用子查询 如果我将WHERE子句更改为equals beer,下面的代码可以正常工作。结果是两个人都喜欢啤酒 但当我试图把它换成那些不喜欢啤酒的人时,它不是一张真正的桌子,每个人都喜欢啤酒;,问题是它删除了食物偏好等于啤酒的确切行。但是那些喜欢披萨但喜欢啤酒的人仍然包括在内 查询正在删除啤酒的相关行,但没有删除与此人相关的所有其他行 如何在不使用子查询的情况下修复此问题 S

我有两个表格,布局如下

人员:

喜欢:

我试图从上面两个表中列出那些不喜欢啤酒的人的名字,使用justjoins,我不允许使用子查询

如果我将WHERE子句更改为equals beer,下面的代码可以正常工作。结果是两个人都喜欢啤酒

但当我试图把它换成那些不喜欢啤酒的人时,它不是一张真正的桌子,每个人都喜欢啤酒;,问题是它删除了食物偏好等于啤酒的确切行。但是那些喜欢披萨但喜欢啤酒的人仍然包括在内

查询正在删除啤酒的相关行,但没有删除与此人相关的所有其他行

如何在不使用子查询的情况下修复此问题

SELECT 
    p1.first_name, p1.last_name, l1.food, l1.person_id

FROM
    persons AS p1
    JOIN likes AS l1
        ON p1.person_id = l1.person_id

WHERE l1.food <> "Beer"
例如,Aoife喜欢啤酒,但也喜欢比萨饼。我希望Aoife从查询结果中完全删除,因为她喜欢啤酒

列出那些不喜欢啤酒的人的名字

您可以使用左连接反模式:

SELECT p1.first_name, p1.last_name
FROM persons AS p1 
LEFT JOIN likes AS l1 ON p1.person_id = l1.person_id AND l1.food = 'Beer'
WHERE l1.person_id IS NULL
这会尝试将每个人加入到“喜欢食物=”啤酒“中的记录中,然后仅对不匹配的记录进行过滤

另一个选项是对相关子查询使用not exists条件:

SELECT p1.first_name, p1.last_name
FROM persons AS p1 
WHERE NOT EXISTS (
    SELECT 1
    FROM likes l1
    WHERE p1.person_id = l1.person_id AND l1.food = 'Beer'
)
在这种情况下,您需要左连接并检查是否没有匹配项。这看起来像:

SELECT p.*
FROM persons p LEFT JOIN
     likes l
     ON p.person_id = l.person_id AND l.food = 'Beer'
WHERE l.person_id IS NULL;  -- there is no match
您不希望在SELECT子句中包含来自LIKE的任何信息-问题只是询问有关人员的信息

相关查询是:

select l.person_id
from likes l
group by l.person_id
having sum(case when l.food = 'beer' then 1 else 0 end) = 0;

这将返回那些喜欢的人列表中没有“啤酒”的人。但这只返回至少有一个相似项的人。有些人可能什么都不喜欢。

注意,beer指的是标准SQL中的一列。字符串常量需要在SQL中用单引号括起来。如果Aoife喜欢啤酒和比萨饼,那么“beer”将是字符串常量。这是表中的两行还是一列中有两个单词?谢谢
SELECT p.*
FROM persons p LEFT JOIN
     likes l
     ON p.person_id = l.person_id AND l.food = 'Beer'
WHERE l.person_id IS NULL;  -- there is no match
select l.person_id
from likes l
group by l.person_id
having sum(case when l.food = 'beer' then 1 else 0 end) = 0;