2016-06-26 18 views
-1

私はINTERNAMENTOとDOC_ADMISSAO2という2つのテーブルを持っています。ORACLE SQL:別の列に基づいてテーブルを更新する方法は?

  1. 00000 - "single-row subquery returns more than one row"

何かアドバイス:私は

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

..いくつかの条件で、DOC_ADMISSAO2はDIASADMISSAOと呼ばれるテーブルの同じ値を持つ名前のDIASINTERNAMENTO INTERNAMENTOテーブルの列を更新したいそれは私にエラーを与えて?

+0

どちらかあなたはwhere句常に単一の行を取得したり、b.DIASADMISSAOに凝集を使用する(IEに基準を追加する必要がありますMAX(b.DIASADMISSAO)) – Turo

+0

ゴードンが提供したばかりのものに加えて、あなたのテーブルには様々な患者の「入院」と「入院」の詳細が表示されていると思われます。 where句でpatient_idを同じにする必要はありませんか? – mathguy

答えて

2

エラーは非常に明確です。副問合せは複数の行を戻しています。あなたはDATACRIACAOに基づいてEPISODIOためDISASMISSAOの最新の値をたいてしまった場合

update INTERNAMENTO a 
set DIASINTERNAMENTO = (
     select max(b.DIASADMISSAO) 
     from DOC_ADMISSAO2 b 
     where (a.EPISODIO = b.EPISODIO) AND (a.DATACRIACAO <= b.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) 
    ); 
あなたはどちらか and rownum = 1を追加したり、集計関数を追加することにより、1行を取得することができます
0

これは、b.datacriacaoがa.datacriacao以上のinternamento.episodioの値に対して、doc_admissao2に複数の行が存在することを意味します。 (未テスト)このような何かをしようとしているものを見つけるために

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; 
関連する問題