0

アプリケーションに監査証跡を実装しています。私はこれに従いこれにより、監査のみが必要なテーブルである履歴テーブルが作成されました。

患者情報を保存する次のテーブルがあります。

TenantIdは、マルチテナント アプリケーションであるため、各テナント データを表します。

PersonPatientテーブル

Id、TenantId、FirstName、LastName、DOB、Mobile、Eメール、AddedBy、UpdatedBy、IsDeleted

忍耐強い

Id、PatientIDentifier、IsOP、CanSendSMS、AddedBy、UpdatedBy、IsDeleted

また別のテーブル

予定

Id、PatientId、AppointmentDate、DoctorId、Price、AddedBy、UpdatedBy

監査履歴表の構造

人物歴

AuditId、Id、FirstName、LastName、DOB、AddedBy、UpdatedBy、AuditUserId、AuditDate、Action

ここでAction表すA(ADD)/U(update)/D(delete)

同じ構造が作成されましたPatient, Appointment

これで、追加/削除/更新が発生するたびに履歴テーブルに挿入するトリガーが得られました。

これで、監査履歴テーブルで使用できるデータを取得できました。

2 つの要件のクエリを作成する必要があります。

  1. 特定の患者のすべてのレコードを取得します。を使用して、PatientHostory、AppointmentHistory、PersonH​​istory からすべてのレコードを取得する必要がありPatientIdます。特定の ID に対して同じテーブルからより多くのレコードを取得する SQL を作成するにはどうすればよいですか? UNION or JOIN?

  2. からすべてのレコードを取得する必要がありますall the HistoryTable for the supplied AuditUser Id

これに対するクエリを作成するにはどうすればよいですか?

4

1 に答える 1

2

UNIONログデータを参照する場合は、参照するテーブルを示す列を追加することも検討してHistoryTypeください

SELECT AuditId, Id, FirstName, LastName, DOB, AddedBy, UpdatedBy, 
       AuditUserId, AuditDate, Action, 'Person' HistoryType
FROM PersonHistory ph
JOIN Person p ON ph.id = p.id 
UNION ALL
SELECT AuditId,Id, FirstName, LastName, DOB, AddedBy, UpdatedBy, 
       AuditUserId, AuditDate, Action, 'Patient' HistoryType
FROM PatientHistory
UNION ALL    
SELECT AuditId,Id, FirstName, LastName, DOB, AddedBy, UpdatedBy, 
       AuditUserId, AuditDate, Action, 'Appointment' HistoryType
FROM AppointmentHistory

上記を にするVIEWと、データをさらに簡単にクエリできるようになります

SELECT * FROM vAuditHistory
WHERE AuditUserId = 1234

「元の」データ、つまり s から情報を取得する必要がある場合はPatientId、再びビューを使用して、次の行に沿って何かを行うことができます

DECLARE @PatientId VARCHAR(10) = '12345ABCDE'

SELECT h.*, p.PatientId
FROM vAuditHistory h
JOIN Patient pt ON pt.id = h.id
WHERE h.HistoryType = 'Patient'
AND pt.PatientId = @PatientId
UNION ALL
SELECT h.*, a.PatientId
FROM vAuditHistory h
JOIN Appointment a t ON a.id = h.id
WHERE h.HistoryType = 'Appointment'
AND pt.PatientId = @PatientId

またはビューなし

SELECT h.*, p.PatientId
FROM PatientHistory h
JOIN Patient pt ON pt.id = h.id
WHERE pt.PatientId = @PatientId
UNION ALL
SELECT h.*, a.PatientId
FROM AppointmentHistory h
JOIN Appointment a t ON a.id = h.id
WHERE pt.PatientId = @PatientId

上記をインライン関数として作成すると、おそらく便利です

于 2013-10-17T13:12:23.447 に答える