2017-04-26 4 views
0

次の構造を持つ2つのテーブルがあります。ネストしたセレクトを使用したMySQLの更新

Accounts (acc_id, name, balance) 
GeneralLedger GL (account_id, voucher_id, debit,credit) 

総勘定元帳テーブルから借方総額と総与信額を計算して勘定残高勘定を更新します。

あなたは、「作品」が、バランスがNULLでヌル結果に加えること、その後はnullとして開始した場合あなたのクエリ私は、クエリの下にしようとしたが、そのは動作していない、誤りがないが、任意のレコードを更新しません

UPDATE accounts a 
INNER JOIN 
(
    SELECT gl.account_id, SUM(gl.debit) total_debit, SUM(gl.credit) total_credit 
    FROM general_ledger gl 
    WHERE gl.voucher_id=1 
    GROUP BY gl.account_id 
) gl ON gl.account_id=a.account_id 

SET a.balance = a.balance + (total_credit-total_debit) 
WHERE a.acc_id=gl.account_id 
+0

どのように動作しませんか?構文エラーが出ますか、または期待した結果が得られませんか? –

+0

サブ・セレクトにリンクがすでに定義されているため、最後のWHERE句は必要ないと考えてください。 –

+0

@ P.Salmon、クエリは0エラーで正常ですが、レコードは更新されません – user3554045

答えて

0

setステートメントでcoalesceを使用してこれをキャッチするか、テーブル定義のデフォルト値を0にします。また、a.account_idのようなフィールドはありませんので、これをa.acc_idに変更する必要があります。

DROP TABLE IF EXISTS Accounts, generalledger ; 

create table accounts(acc_id int, name varchar(3), balance int); 
create table generalledger(account_id int, voucher_id int, debit int,credit int); 

insert into accounts values (1,'aaa',null),(2,'bbb',100); 

insert into generalledger values 
(1,1,10,null),(1,1,null,20), 
(2,1,10,null),(2,1,null,10); 

UPDATE accounts a 
INNER JOIN 
(
    SELECT gl.account_id, SUM(gl.debit) total_debit, SUM(gl.credit) total_credit 
    FROM generalledger gl 
    WHERE gl.voucher_id=1 
    GROUP BY gl.account_id 
) gl ON gl.account_id=a.acc_id 

SET a.balance = coalesce(a.balance,0) + (total_credit-total_debit) 
; 
select * from accounts; 

MariaDB [sandbox]> select * from accounts; 
+--------+------+---------+ 
| acc_id | name | balance | 
+--------+------+---------+ 
|  1 | aaa |  10 | 
|  2 | bbb |  100 | 
+--------+------+---------+ 
2 rows in set (0.00 sec) 
+0

ありがとう – user3554045

関連する問題