T-SQL - 将事务表连接到审计表

时间:2017-10-26 05:36:25

标签: sql-server tsql audit-trail

说我有这两个表:

交易表

Pmt ID    VendorID      PaymentDate
 1             1        2017-10-01 00:14:42
 2             2        2017-09-03 00:08:23

第二个表有一个VendorID列表,每次关联的电子邮件都会更改。它本来可以改变很多次。

审核表

VendorID       Email                CreateDateUTC
1              a@gmail.com          2016-01-01 17:51:08
1              b@gmail.com          2016-03-03 12:40:03
1              c@gmail.com          2017-01-10 03:40:04
2              li@gmail.com         2017-03-30 05:40:03

编辑:所以说这会显示在2016-01-01 17:51:08之后但在2016-03-03 12:40:03之前进入供应商ID 1的任何付款都转到了a@gmail.com。在2016-03-03 12:40:03之后但在2017-01-10 03:40:04之前转到供应商ID 1的任何付款都转到b@gmail.com。并且2017-01-10 03:40:04之后的任何供应商ID 1的任何内容都转到了c@gmail.com(除非当然,在审计表中还有另一个最近的供应商1条目)。

如果我说 - 想知道发送给example@gmail.com发送电子邮件的每笔交易,我怎么能查询呢?

我的假设是我接受交易表 - 然后加入审计表。那么好的,我们有每笔交易,以及它去的电子邮件。但是,如何只加入正确的电子邮件?或者,我是否可能完全以错误的方式思考这个问题?

3 个答案:

答案 0 :(得分:0)

您必须创建一个供应商主数据库,其中仅存储具有唯一ID的主要不同供应商。 然后创建一个子表供应商联系人详细信息。在其中添加多个在主服务器和供应商联系人详细信息中创建的供应商的联系人详细信息,还插入一个字段isPrimary,该字段分叉要选择的供应商地址。 然后加入并完成任务

答案 1 :(得分:0)

需要更多信息,但也许这会有用吗?

select distinct t.PmtID, t.VendorID, t.PaymentDate
from tblTrans t
inner join tblAudit a
on t.VendorID = a.VendorID
where t.PaymentDate <= a.CreateDateUTC
and a.Email = 'a@gmail.com'
order by t.PaymentDate

答案 2 :(得分:0)

以下查询返回事务表中的所有行,并且它与审计表匹配,并获取在事务处理时已将电子邮件发送到的电子邮件ID

SELECT * FROM 
(
   SELECT VENDOR.*,Audit.Email,ROW_NUMBER() OVER(PARTITION BY 
           Vendor.VendorID ORDER BY DATEDIFF(D,CreateDateUTC, PaymentDate) DESC) RNo
   FROM Vendor LEFT OUTER JOIN Audit ON Vendor.VendorId =Audit.VendorId 
   WHERE PaymentDate > CreateDateUTC 
)T
WHERE RNo = 1