我不想打字太多,所以我创建了较小的样本数据集。
SQL> select * from disorders order by id;
ID DISO MINIMUM_SYMPTOMS
---------- ---- ----------------
64 OCRD 0
65 OCD 0
248 GPD 0
SQL> select * from symptoms order by disorder_id, id;
ID SYMPTO DISORDER_ID
---------- ------ -----------
2 test 3 64
3 test 1 64
4 test 5 64
5 test 2 64
7 test 4 64
3 test 1 65
5 test 2 65
7 test 4 65
3 test 1 248
4 test 3 248
5 test 2 248
11 rows selected.
查询 - 与您的类似 - 但仅基于 symptoms 表。为什么?你现在不需要disorders;稍后将在merges using 子句中使用此查询:
SQL> select s.disorder_id,
2 round((count(s.id) / 2), 0) minsym
3 from symptoms s
4 group by s.disorder_id;
DISORDER_ID MINSYM
----------- ----------
248 2
64 3
65 2
SQL>
好的,现在让我们将这些结果与disorders 表合并:
SQL> merge into disorders d
2 using (select s.disorder_id,
3 round((count(s.id) / 2), 0) minsym
4 from symptoms s
5 group by s.disorder_id
6 ) x
7 on (d.id = x.disorder_id)
8 when matched then update set
9 d.minimum_symptoms = x.minsym;
3 rows merged.
结果:
SQL> select * from disorders order by id;
ID DISO MINIMUM_SYMPTOMS
---------- ---- ----------------
64 OCRD 3
65 OCD 2
248 GPD 2
SQL>
所以,是的 - 这就是你将要做到这一点的“方式”(至少,一种选择)。