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