【问题标题】:Oracle SQL : Updating a column with count query of another tableOracle SQL:使用另一个表的计数查询更新列
【发布时间】:2021-09-17 08:25:17
【问题描述】:

我有两张桌子。 第一个“DISORDERS”字段:“ID”编号、“描述”varchar2、“MINIMUM_SYMPTOMS”编号

使用这些数据:

第二个表是“SYMPTOMS”,字段为:“ID”编号、“SYMPTOM”varchar2、“DISORDER_ID”编号 (FK_DISORDERS_ID)

在我的第二张表中,我有这些数据:

通过这个查询,我可以找到最小的症状(第二张表中的记录),以便我的病人患有这种疾病:

select DISORDERS.DISORDER as DISORDER, ROUND((COUNT(SYMPTOMS.ID) / 2) ,0) as MINIMUM_SYMPTOMS
from SYMPTOMS SYMPTOMS,
    DISORDERS DISORDERS 
where SYMPTOMS.DISORDER_ID=DISORDERS.ID
group by DISORDERS.DISORDER

我得到了正确的结果:

我想在我的第一个表中更新字段“MINIMUM_SYMPTOMS”并输入上一个查询中的 MINIMUM_SYMPTOMS 值。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    我不想打字太多,所以我创建了较小的样本数据集。

    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> 
    

    所以,是的 - 这就是你将要做到这一点的“方式”(至少,一种选择)。

    【讨论】:

    • 非常感谢@Littlefoot!
    【解决方案2】:

    您可以将update 与相关子查询一起使用:

    update disorders d
        set minimum_symptoms = (select round(count(*) / 2)
                                from symptoms s
                                where s.disorder_id = d.id
                               );
    

    您的示例是更新disorders 中的所有行。如果您只想更新在symptoms 中匹配的行:

    update disorders d
        set minimum_symptoms = (select round(count(*) / 2)
                                from symptoms s
                                where s.disorder_id = d.id
                               )
       where exists (select 1
                     from symptoms s
                     where s.disorder_id = d.id
                    );
    

    【讨论】:

    • 非常感谢@Gordon Linoff!
    猜你喜欢
    • 2015-01-29
    • 1970-01-01
    • 2011-10-25
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多