ORACLE SQL: 如何更新基于另一列的 table?

ORACLE SQL: how to update a table based in another column?

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

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 - "single-row subquery returns more than one row"

有什么建议吗?

错误很明显。子查询返回多行。您可以通过添加 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)
     );

如果你恰好想要基于DATACRIACAOEPISODIODISASMISSAO的最新值,那么你可以使用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)
     );

这意味着 doc_admissao2 中有多个行,对于 internamento.episodio 的某个值,其中 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;