Для всех (l oop) в запросе SQL? - PullRequest
1 голос
/ 03 мая 2020

Доброе утро / день / вечер

Я борюсь с этим SQL запросом, в котором я должен найти тех, кто на 10 лет старше тех, кого они знают. Так что я должен найти Вуди и Сандру, так как они оба (Уэйд знает, как быстро, а Сандра тоже знает Пейси), знают кого-то, кто моложе их. Также нам нужно знать, что если один человек знает другого, то они знают друг друга. Вот почему ответ Сандра и Уэйд

Таблицы можно найти в конце

Любой совет, как я могу решить эту проблему?

Таблица людей

| id | имя | возраст
+ ---- + ----------- + ------ | 77 | Уэйд | 83 | 78 | Пейси | 09 | 79 | Сандра | 27 | 80 | Сури | 21 | 81 | Андрей | 25 | 82 | Джойс | 04 | 83 | Бекки | 24 | 84 | Кевин | 17

Таблица знаю

| id | IDpersonA | IDpersonB
+----+-----------+----------
| 105 |    78     |    79
| 106 |    80     |    79
| 107 |    77     |    80
| 108 |    79     |    77
| 109 |    79     |    78
| 110 |    77     |    79
| 111 |    79     |    77
| 112 |    80     |    78

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

В этом случае вы можете использовать all:

select p.*
from people p
where p.age > all (select p2.age
                   from knows k join
                        people pb
                        on k.IDpersonB = pb.id
                   where k.IDpersonA = p.id
                  );

Это вернет людей, которые никого не знают.

Вы также можете использовать агрегирование в подзапросе:

select p.*
from people p
where p.age > (select max(p2.age)
               from knows k join
                    people pb
                    on k.IDpersonB = pb.id
               where k.IDpersonA = p.id
              );

Это немного отличается. Требуется, чтобы кто-то знал хотя бы одного человека.

0 голосов
/ 03 мая 2020

При подходе используется not exists:

select p.*
from persons p
where not exists (
    select 1
    from knows k
    inner join persons p1 on p1.id = k.idPersonB
    where p.id = k.idPersonA and p1.age > p.age
)

Если вы хотите убедиться, что люди в наборе результатов знают по крайней мере еще одного человека:

select p.*
from persons p
where 
    exists (select 1 from knows k where p.id = k.idPersonA)
    and not exists (
        select 1
        from knows k
        inner join persons p1 on p1.id = k.idPersonB
        where p.id = k.idPersonA and p1.age > p.age
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...