Update语句根据另一个表的最大行设置列

时间:2015-04-25 15:24:34

标签: sql sql-update h2

我有一个Family表:

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表:

SELECT * FROM Children;

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

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

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

1 个答案:

答案 0 :(得分:3)

以下是解决此问题的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不支持此功能。