【问题标题】:Finding a person who has eaten apples but has not eaten bananas找一个吃过苹果没吃过香蕉的人
【发布时间】:2020-04-28 15:52:14
【问题描述】:

我想设置一个 SQLite 查询来确定具有特定 person_id 的人是否吃了 Fruit 'apple' 而不是水果 'banana'。我可以访问Fruit 表,其中包含有关谁吃了哪种水果的信息。然后,我想将此信息用于SELECTapples 但不是bananas 与子查询的人的姓氏。 在我看来,它会是这样的:

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;

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

F1.type <> F2.type

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

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

【问题讨论】:

    标签: sql sqlite select subquery


    【解决方案1】:
    SELECT
      P.last_name
    FROM
      Person AS P
    WHERE
      P.pid IN (
        SELECT
          F1.pid
        FROM Fruit AS F1
          LEFT JOIN Fruit AS F2 ON F2.type = 'banana' AND F1.pid = F2.pid
        WHERE
          F1.type = 'apple'
          AND F2.pid IS NULL
    
      )
    ORDER BY P.pid;
    

    【讨论】:

    • 这正是我想要的。
    【解决方案2】:

    使用聚合:

    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 子句表示只有一种水果。 . .那个水果是苹果。

    【讨论】:

    • 您可能还需要GROUP BY pid
    【解决方案3】:

    主查询选择吃苹果的人。

    NOT EXISTS 不包括吃香蕉的人。

    SELECT p.last_name
    FROM person p
         INNER JOIN fruit apple ON apple.pid = p.pid
    WHERE apple.type = 'apple'
    AND NOT EXISTS (
         SELECT 1
         FROM fruit banana
         WHERE banana.pid = p.pid
         AND banana.type = 'banana'
    )
    

    【讨论】:

      猜你喜欢
      • 2015-02-21
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 2020-07-30
      • 2011-04-01
      相关资源
      最近更新 更多