更新语句以根据另一个 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 的 Name
和 Oldest_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 不支持此功能。
我有一个 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 的 Name
和 Oldest_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 不支持此功能。