0

我正在我的应用程序中实施审计跟踪。我遵循了这个创建了只需要审计的表的历史表。

我有一个下表来存储患者信息。

TenantId代表每个租户数据,因为它是一个多租户应用程序

PersonPatient

Id、TenantId、FirstName、LastName、DOB、Mobile、Email、AddedBy、UpdatedBy、IsDeleted

病人

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

还有另一张桌子

预约

Id、PatientId、AppointmentDate、DoctorId、价格、AddedBy、UpdatedBy

审计历史表结构

人物历史

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

这里Action代表A(ADD)/U(update)/D(delete)

已创建相同的结构Patient, Appointment

现在,每当添加/删除/更新发生时,我都会将触发器插入到历史记录表中。

现在我得到了审计历史表中可用的数据。

我必须针对两个要求编写查询。

  1. 获取特定患者的所有记录。我需要使用PatientId. 我们如何编写 SQL 来从给定 id 的同一张表中获取更多记录?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

将上述内容转换为 aVIEW将使您可以更轻松地进一步查询数据

SELECT * FROM vAuditHistory
WHERE AuditUserId = 1234

如果您需要从“原始”数据中获取信息,即PatientIds 然后再次使用视图,您可以执行以下操作

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 回答