Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ORACLE SQL:如何更新另一列中的表?_Sql_Oracle_Sql Update_Dml - Fatal编程技术网

ORACLE SQL:如何更新另一列中的表?

ORACLE SQL:如何更新另一列中的表?,sql,oracle,sql-update,dml,Sql,Oracle,Sql Update,Dml,我有两张桌子,Internamto和DOC_Admissa2。我想用名为DIASADMISSAO的表DOC_ADMISSAO2的相同值更新名为diasadmisso的internanto表中的一列,但有一些条件 update INTERNAMENTO a set a.DIASINTERNAMENTO = ( select b.DIASADMISSAO from DOC_ADMISSAO2 b where (a.EPISODIO = b.EPISODIO)

我有两张桌子,Internamto和DOC_Admissa2。我想用名为DIASADMISSAO的表DOC_ADMISSAO2的相同值更新名为diasadmisso的internanto表中的一列,但有一些条件

update INTERNAMENTO a
set a.DIASINTERNAMENTO = (
       select b.DIASADMISSAO
       from DOC_ADMISSAO2 b
       where (a.EPISODIO = b.EPISODIO) AND (a.DATACRIACAO <= b.DATACRIACAO));
这给了我一个错误:

00000-单行子查询返回多行
有什么建议吗?

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

这意味着在doc_admissa2中有多行用于Internamto.eposito的某些值,其中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;

您必须在where子句中添加一个标准,以始终获得一行,或者在子选择素中使用b.DIASADMISSAO的聚合,即MAXb.DIASADMISSAO除了Gordon刚才提供的之外,您的表可能会显示住院和入院的详细信息。。。对于不同的病人?您不需要where子句中的患者id相同吗?
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;