首页 > 解决方案 > 找一个吃过苹果没吃过香蕉的人

问题描述

我想设备一个 SQLite 查询,找出一个人是否person_id吃过Fruit 'apple'水果但没有吃过水果'banana'。我可以访问一个Fruit表格,其中包含有关谁吃了哪种水果的信息。然后,我想将此信息用于带有子查询但不吃 sSELECT的人的姓氏。在我看来,它会是这样的:applebanana

SELECT
  P.last_name
FROM
  Person AS P
WHERE
  P.pid IN (
    SELECT
      F1.pid
    FROM
      Fruit AS F1,
      Fruit AS F2
    WHERE
      F1.pid = F2.pid
      AND F1.type = 'apple'
      AND F2.type <> 'banana'
  )
ORDER BY P.pid;

但是,这不是一个足够严格的条件,因为现在我允许与 in 中相同的水果类型F2F1这仍然允许选择该人。另一方面,我不能限制太多,例如

F1.type <> F2.type

SELECT在子查询中,因为这会将合法人员从ed中踢出。

必须有什么限制才能使这项工作有效?

标签: sqlsqliteselectsubquery

解决方案


使用聚合:

select p.lastname
from person p
where p.fruit in ('apple', 'banana')
group by p.lastname
having min(p.fruit) = max(p.fruit) and min(p.fruit) = 'apple';

where查询限制为仅考虑苹果和香蕉。该having条款说只有一种水果。. . 那个水果是苹果。


推荐阅读