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));
它给我一个错误:
- 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)
);
如果你恰好想要基于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)
);
这意味着 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;
所以,我有两个 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));
它给我一个错误:
- 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)
);
如果你恰好想要基于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)
);
这意味着 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;