2017-05-03 6 views
0

に更新された場合は、テーブルの列を更新する方法:別のテーブルの列は、私は次の構造を持っているSQLで二つのテーブル持っているSQL

1)医師の表

DoctorId PendingCases OngoingCases CompletedCases 

2)ケース表

CaseId DoctorId CaseStatus 

ケーステーブル内で、CaseStatusが0に設定されている場合は保留中のケース、1に設定されている場合は継続中のケース、2に設定されている場合は完了したケースです。

だから、彼のdoctorid与えられた医師のための保留件数は次のようになります。

select count(*) as 'Pending Cases' 
from Cases 
Where doctorid = '993883' 
and casestatus = 0; 

しかし、私は自動的にドクターテーブル内の3つの列を更新するには、この情報を必要とします。私はトリガを使用しなければならないことを知っています、あなたがこれを実証できるなら、それは良いでしょう。

+0

これはリレーショナル設計にはあまり適しておらず、あらゆる問題を引き起こす可能性があります。このようなデータを複製するべきではありません! –

+0

私は@ NigelRenに同意します。保留中の、進行中の、完了した症例の数をすべての医師に表示するために、私は直接症例テーブルのクエリを呼び出す必要があります。しかし、私はすでに複数の場所でアプリケーションにAPIを統合しており、元に戻すことは難しいでしょう。 :( –

答えて

1

がテーブルを更新しない、ちょうど

CREATE VIEW doctors AS 
SELECT 
doctorId, 
SUM(IF(casestatus = 0, 1, 0)) AS pending, 
SUM(IF(casestatus = 1, 1, 0)) AS ongoing, 
SUM(IF(casestatus = 2, 1, 0)) AS completed 
FROM cases 
GROUP BY doctorId; 

ビューを使用するとあなたは

SELECT * FROM doctors WHERE doctorId = 993883; 
+0

ああ、やってみるといい方法です。ありがとう –

0

ようなビューを照会することができ、私たちは列を更新するためにトリガを使用する方法を考え出した:

create trigger updatedoctorscases 
on cases 
for insert, update, delete 
as begin 
    update doctors 
    set pendingcases = (select count(*) from cases 
    where casestatus = 0 
    and doctors.doctorid = cases.doctorid); 
    update doctors 
    set ongoingcases = (select count(*) from cases 
    where casestatus = 1 
    and doctors.doctorid = cases.doctorid); 
    update doctors 
    set completedcases = (select count(*) from cases 
    where casestatus = 2 
    and doctors.doctorid = cases.doctorid); 
end 
関連する問題