【问题标题】:ORACLE SQL: how to update a table based in another column? [duplicate]ORACLE SQL:如何更新基于另一列的表? [复制]
【发布时间】:2016-10-28 19:18:46
【问题描述】:

所以,我有两张桌子,INTERNAMENTO 和 DOC_ADMISSAO2。我想从名为 DIASINTERNAMENTO 的表 INTERNAMENTO 中更新一个列,其值与名为 DIASADMISSAO 的表 DOC_ADMISSAO2 的值相同,但有一些条件..

update INTERNAMENTO a
set a.DIASINTERNAMENTO = (
       select b.DIASADMISSAO
       from DOC_ADMISSAO2 b
       where (a.EPISODIO = b.EPISODIO) AND (a.DATACRIACAO <= b.DATACRIACAO));

它给了我一个错误:

  1. 00000 - “单行子查询返回多于一行”

有什么建议吗?

【问题讨论】:

  • 要么您必须在 where 子句中添加一个条件以始终获得单行,要么在子选择中对 b.DIASADMISSAO(即 MAX(b.DIASADMISSAO) )使用聚合
  • 除了 Gordon 刚刚提供的内容之外,大概您的表格还显示了各种患者的“住院”和“入院”的详细信息……?你不需要在 where 子句中的 patient_id 相同吗?

标签: sql oracle sql-update dml


【解决方案1】:

错误很明显。子查询返回不止一行。您可以通过添加and rownum = 1 或添加聚合函数来获得一行:

update INTERNAMENTO a
set DIASINTERNAMENTO = (
       select max(b.DIASADMISSAO)
       from DOC_ADMISSAO2 b
       where (a.EPISODIO = b.EPISODIO) AND (a.DATACRIACAO <= b.DATACRIACAO)
     );

如果您碰巧想要基于DATACRIACAO 的EPISODIO 的最新值DISASMISSAO,那么您可以使用keep:

update INTERNAMENTO a
set DIASINTERNAMENTO = (
       select max(b.DIASADMISSAO) keep (dense_rank first order by b.DATACRIACAO desc)
       from DOC_ADMISSAO2 b
       where (a.EPISODIO = b.EPISODIO) AND (a.DATACRIACAO <= b.DATACRIACAO)
     );

【讨论】:

    【解决方案2】:

    这意味着 doc_admissao2 中有多个行,其中 b.datacriacao 大于或等于 a.datacriacao。

    要找出哪些,请尝试以下方法(未经测试):

    SELECT a.episodio, count(*)
      FROM internamento a JOIN doc_admissao2 b ON a.episodio = b.episodio
     WHERE a.DATACRIACAO <= b.DATACRIACAO
     GROUP BY a.episodio
    HAVING count(*) > 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 2023-01-12
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      相关资源
      最近更新 更多