我有一个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 ...
列,该语句将其设置为每个家庭中年龄最大的孩子的Name
和Oldest_Age
。找到每个最老的孩子的名字是一个在这里得到很好解决的问题:How can I SELECT rows with MAX(Column value), DISTINCT by another column in SQL?
但是,我不知道如何在UPDATE
语句中使用此结果来使用h2
数据库更新关联表的列。
答案 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不支持此功能。