Поиск человека, который ел яблоки, но не ел бананы - PullRequest
0 голосов
/ 28 апреля 2020

Я бы хотел создать запрос SQLite, который выяснит, съел ли человек с определенным person_id Fruit 'apple', но не фрукт 'banana'. У меня есть доступ к таблице Fruit, которая содержит информацию о том, кто съел какой тип фруктов. Затем я хотел бы использовать эту информацию для SELECT фамилии человека, который съел apple с, но не banana с подзапросом. На мой взгляд, это будет go примерно так:

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

в подзапросе, так как это исключит законных лиц из SELECT ed.

Каким должно быть ограничение, чтобы эта работа работала?

Ответы [ 3 ]

2 голосов
/ 28 апреля 2020
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 голосов
/ 28 апреля 2020

Использовать агрегацию:

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 говорится, что есть только один фрукт. , , и этот фрукт - яблоко.

0 голосов
/ 28 апреля 2020

Основной запрос выбирает людей, которые ели яблоки.

* 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'
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...