SQL连接问题的查询结果问题。基本问题

我有两个表,布局如下

person_id,first_name,last_name,gender,birth_date,street,town,county

点赞

person_id,food

我试图仅使用JOINS(上面的表中“列出不喜欢啤酒的人的名字”)(不允许使用子查询)。

如果我将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因为喜欢啤酒而从查询结果中完全删除。

mysetry 回答:SQL连接问题的查询结果问题。基本问题

在这种情况下,您需要left join并检查是否没有匹配项。看起来像:

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

您不想在likes子句中包含来自SELECT的任何信息-问题仅是在询问有关人的信息。

一个相关的查询是:

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'的人。但这只会返回至少有一个like的人。而且有些人可能什么都不喜欢。

,
  

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

您可以使用LEFT JOIN反模式:

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

这会尝试将每个人与likesfood = 'Beer'中的记录一起加入,然后仅过滤不匹配的记录。

另一种选择是对关联子查询使用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'
)
本文链接:https://www.f2er.com/3164265.html

大家都在问