2017-10-24 7 views
-1

したがって、2つの表があります。簡単にするために、2つの列を1つずつ表示し、もう1つは他の列のみを表示しますが、データはもっとたくさんあります。oracle SQLでのselectの更新での問題

okが、そう、テーブルは次のようになります。

_________________________________ 
|   table 1    | 
+---------------------------------+ 
| gas_deu   est_pag  | 
+---------------------------------+ 
|  56857   (null)  | 
|  60857   (null)  | 
|  80857   (null)  | 
+---------------------------------+ 

______________________ 
|  table 2   | 
+----------------------+ 
|  gas_pag   | 
+----------------------+ 
|  56857   | 
|  21000   | 
|  75857   | 
+----------------------+ 

表1と表2は
は何をここで起こっていることは、以下の基本的である(両方のテーブルに同じ名前)id_edi、およびnr_depを使用して参加することができます:
表1には、誰かに所有されている番号であるgas_deuがあります。
表2のgas_pagは、gas_deu-gas_pagがgas_deuが完全に支払われた場合は0(または負)、部分的に支払われた場合は正の数を示すことを意味します。
また、表1の一部の行は表2ではgas_deuが全く支払われていないことを意味していません。私がする必要がどのような

は、次のと表1に更新est_pagです:
gas_deu-gas_pag < = 0の場合(債務が支払われる)gas_deu-gas_pag>は(部分的に0支払ったならば、1
にest_pag値を更新行が表1であるが、表2に、それが全く支払われていなかったではないので、est_pag値は3

になり、私は多くのことを試してみました、そして私が意味する場合)、その後2
にest_pag値を更新このための更新のコードがたくさんあるので、テーブルには多くの列があるので、混乱してしまうだけなので、試したコードを投稿することはできません。
私は主に、アップデートのセットとアップデートの場所でselectサブクエリを使用しようとしました。それらのすべてが常に私に単一の行のエラーを与える、私はこれが複数の値を返すために起こることを知っているが、どうすればよいだろうか?私は、クエリの値が1つしか得られず、負債ステータスに一致する行のみを更新する方法は見当たりません。

ケースを論理的に選択してくれましたが、いつでも複数の行が返されます(gas_deu-gas_pagの場合< = 0、次に1つのエスト_ページ終了)。少なくとも1つの値があれば、始まりますが、同じ行以上の問題が発生します)

何か助けや提案をいただければ幸いです。 stackoverflowで、まだそれを動作させることができません
編集:テーブル1は、更新後にどのように見えるはずです


|   table 1    | 
+---------------------------------+ 
| gas_deu   est_pag  | 
+---------------------------------+ 
|  56857    1  | 
|  60857    2  | 
|  80857    2  | 
+---------------------------------+ 


アップデート2:

update table1 
set est_pag=(select (case when (select min((case when gasto.gas_deu- 
pago.gas_pag<=0 then 0 else null end)) 
from table2 pago full outer join gasto_comun_pruebaestpago gasto on 
pago.nr_dep=gasto.nr_dep 
where gasto.nr_dep=pago.nr_dep and gasto.id_edi=pago.id_edi)=0 then 1 else 
null end) 
from table2 pago full outer join gasto_comun_pruebaestpago gasto on 
pago.nr_dep=gasto.nr_dep 
where gasto.nr_dep=pago.nr_dep and gasto.id_edi=pago.id_edi) 
where est_pag is null; 


これは私が試した多くのコードのいずれかです。これはすべての値を1に変更します。これはmin()のbacauseであり、そこには1行だけが出力され、0であればcaseでチェックされ、0であれば0がすべて1になります。 min()を指定しないとselectは必要な処理を行いますが、 '1行のサブクエリが複数の行を返します'というエラーが再び返されます。

+2

あなたのコードですか?テーブル構造はどこですか?サンプルの入力と出力はどこですか? – Eric

+0

この時点では大きなメッセージなのでコードを投稿していませんでした。カラム名は膨大で、テーブル構造について言及しましたが、両方のテーブルが両方のテーブルに同じ名前のid_ediとnr_depによって結合されています 私は何を得るかを示す表を追加します。 – DMage

+0

支払った借金と部分的に支払った借金の差額を知ることはできません。 – Eric

答えて

0

左外部結合を使用して更新できます。 2番目のテーブルに同じアカウントの複数の支払いがある可能性があります(顧客は部分的な支払いをする可能性があります)ので、最初に2番目のテーブルをIDで集計します。あなたはテスト用の入力データを提供していませんでしたので、私の小さなテストではテーブルがid(最初のテーブルのプライマリキー、2番目のテーブルの外部キー - テーブルに制約を書き込んでいないのに定義)。アカウントが第二のテーブルに存在しない場合は、だけでなく、それは存在するが、gas_pagの列にNULLであれば

私が更新を書いた方法で、3が割り当てられます。 (その列が最初からNOT NULLと宣言されていれば最善です!)その場合、別の処理が必要な場合は、しかし、それは簡単に収容することができます。

だから、ここに行きます。

テーブル作成

create table t1 (id number, gas_deu number, est_pag number); 

insert into t1 
    select 101, 56857, null from dual union all 
    select 104, 60857, null from dual union all 
    select 108, 80857, null from dual 
; 

create table t2 (id number, gas_pag number) ; 

insert into t2 
    select 101, 56857 from dual union all 
    select 104, 60000 from dual 
; 

select * from t1; 

     ID GAS_DEU EST_PAG 
---------- ---------- ---------- 
     101  56857   
     104  60857   
     108  80857   

select * from t2; 

     ID GAS_PAG 
---------- ---------- 
     101  56857 
     104  60000 

UPDATE文

update 
    (select est_pag, gas_deu, gas_pag 
    from t1 left join 
      (select id, sum(gas_pag) as gas_pag from t2 group by id) x 
      on t1.id = x.id 
) 
set est_pag = case when gas_deu <= gas_pag then 1 
         when gas_deu > gas_pag then 2 
         else        3 
     end 
; 

select * from t1; 

     ID GAS_DEU EST_PAG 
---------- ---------- ---------- 
     101  56857   1 
     104  60857   2 
     108  80857   3 

CLEAN-UP

drop table t1 purge; 
drop table t2 purge; 
関連する問題