更新语句以根据另一个 table 的最大行设置列

Update statement to set a column based the maximum row of another table

我有一个 Family table:

SELECT * FROM Family;

id | Surname  | Oldest | Oldest_Age    
---+----------+--------+-------
 1 | Byre     | NULL   | NULL
 2 | Summers  | NULL   | NULL
 3 | White    | NULL   | NULL
 4 | Anders   | NULL   | NULL

Family.Oldest 列尚未填充。 Children中还有一个table:

SELECT * FROM Children;

id | Name     | Age  | Family_FK
---+----------+------+--------
 1 | Jake     | 8    | 1
 2 | Martin   | 7    | 2
 3 | Sarah    | 10   | 1
 4 | Tracy    | 12   | 3

其中很多children(或没有children)可以与一个家庭相关联。我想使用 UPDATE ... SET ... 语句填充 Oldest 列,将其设置为每个家庭中最老 child 的 NameOldest_Age。找到每个最老 child 的名字是一个在这里很好解决的问题:How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?

但是,我不知道如何在 UPDATE 语句中使用此结果来更新使用 h2 数据库的关联 table 的列。

以下是解决此问题的 ANSI-SQL 语法:

update family
    set oldest = (select name
                  from children c
                  where c.family_fk = f.id
                  order by age desc
                  fetch first 1 row only
                 )

在 h2 中,我认为您会使用 limit 1 而不是 fetch first 1 row only

编辑:

对于两列——唉——解决方案是两个子查询:

update family
    set oldest = (select name
                  from children c
                  where c.family_fk = f.id
                  order by age desc
                  limit 1
                 ),
        oldest_age = (select age
                      from children c
                      where c.family_fk = f.id
                      order by age desc
                      limit 1
                     );

一些数据库(例如 SQL Server、Postgres 和 Oracle)支持有助于解决此问题的横向连接。另外,row_number()也可以帮助解决这个问题。很遗憾,H2 不支持此功能。