代码之家  ›  专栏  ›  技术社区  ›  newUser

ORACLE SQL:如何更新基于其他列的表?[副本]

  •  -1
  • newUser  · 技术社区  · 9 年前

    因此,我有两个表,INTERNAMENTO和DOC_ADMISSAO2。我想用表DOC_ADMASSAO2的相同值(称为DIASADMISSAO)更新表INTERNAMINTO中名为DIASINTERNAMENTO的列,但有一些条件。。

    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-“单行子查询返回多行”

    有什么建议吗?

    2 回复  |  直到 9 年前
        1
  •  4
  •   Gordon Linoff    9 年前

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

    如果您碰巧想要 DISASMISSAO 对于 EPISODIO 基于 DATACRIACAO ,然后您可以使用 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
  •  1
  •   DCookie    9 年前

    这意味着doc_admissao2中有多行用于internalamento的某些值。b.datacriaco大于或等于a.datacriaco的情节。

    要找出其中的一个,请尝试以下方法(未测试):

    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;