Как написать запрос, в котором указаны имена всех, кому не принадлежит голубой дом? - PullRequest
1 голос
/ 23 июня 2019

Q.Напишите запрос, в котором указаны имена всех, кому не принадлежит голубой дом.

Вот мой код:

SELECT persons.name
FROM persons
JOIN houses ON (persons.id=houses.owner_id)
WHERE houses.color<>'Blue';

Ниже показаны две таблицы:

enter image description here

Мой результат:

enter image description here

Ожидаемый результат:

enter image description here

Как я могу предотвратить появление «Ариана» в моих результатах?

"Ариан" владеет двумя домами, один красный и один синий.Из-за красного дома, которым он владеет, он подходит к моим результатам.Я изо всех сил пытаюсь выяснить, как исключить его.

Ответы [ 3 ]

2 голосов
/ 23 июня 2019

Мы также можем использовать агрегацию для решения вашей проблемы:

SELECT p.name
FROM person p
INNER JOIN houses h
    ON p.id = h.owner_id
GROUP BY p.name
HAVING SUM(h.color = 'Blue') = 0;

Обратите внимание, что эффективность этого подхода будет аналогична ответу Гордона.

2 голосов
/ 23 июня 2019

Вы можете использовать not exists:

SELECT p.name
FROM persons p
WHERE NOT EXISTS (SELECT 1
                  FROM houses h
                  WHERE h.owner_id = p.id AND
                        h.color = 'Blue'
                 )
0 голосов
/ 23 июня 2019

Вы можете использовать anti-join :

SELECT persons.name
FROM persons
LEFT JOIN houses
  ON  persons.id   = houses.owner_id
  AND houses.color = 'Blue'
WHERE houses.owner_id IS NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...