对于SQL查询中的所有(循环)?

问题描述 投票:0回答:2

早/晚/晚

我正在为此SQL查询苦苦挣扎,在其中我应该找到所有比他们认识的人年龄更大的人。因此,我应该找到伍迪和苏珊,因为他们两个(伍迪认识彼得,苏珊也认识彼得)都认识一个比他们年轻的人。

可以找到这些表:here(为了方便访问,我还将在问题的末尾写它们)

关于如何解决这个问题的任何建议?

餐桌人

| id | name      | age  
+----+-----------+------
| 11 | Woody     | 63 
| 12 | Peter     | 19 
| 13 | Susan     | 33 
| 14 | Sigourney | 24

表知道

| id | IDpersonA | IDpersonB
+----+-----------+----------
| 17 |    11     |    12
| 19 |    11     |    13
| 15 |    11     |    14
| 18 |    12     |    13
| 16 |    14     |    12

Ref:

sql database for-loop exists forall
2个回答
0
投票

在这种情况下,您可以使用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
投票

这里是使用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
    )
© www.soinside.com 2019 - 2024. All rights reserved.