比较单个SQL表中的记录

时间:2015-02-06 21:41:15

标签: sql-server

使用SQL 2008 R2

我有一个包含Windows安全事件日志条目的表。可能的事件ID是560,562和564。

这些是用户删除文件时创建的三个事件日志条目。

560包含有关执行删除的用户,源IP,文件名等的大部分数据。但是,560不是确认删除发生的事件。 560是对象打开事件类型。

当用户删除文件时,首先创建560(对象打开),然后创建562(句柄关闭),最后创建564(对象删除)。

所有这三个事件之间的共同点是Handle ID。因此,对于单个删除,您将获得类似于以下内容的内容:

EventID HandleID UserName              Event            File
564     000015f7 NT AUTHORITY\SYSTEM   Object Delete    N/A
562     000015f7 NT AUTHORITY\SYSTEM   Handle Closed    N/A
560     000015f7 DOMAIN\USER           Object Open      \share\filename

我想要来自560事件的UserName和File,但只有当564 w /相同的HandleID时才会这样。

2 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。您可以使用相关子查询:

SELECT UserName, File
FROM EventTableNameNotProvided e1
WHERE e1.EventID = 560
    AND EXISTS (SELECT 1 
        FROM EventTableNameNotProvided e2
        WHERE e2.HandleID = e1.HandleID
            AND e2.EventID = 564)

或者自我加入:

SELECT e1.UserName, e1.File
FROM EventTableNameNotProvided e1
JOIN EventTableNameNotProvided e2
    ON e2.HandleID = e1.HandleID
WHERE e1.EventID = 560
    AND e2.EventID = 564

对于SELECT DISTINCT,其中一个或两个查询可能更有用。这取决于您的数据。

答案 1 :(得分:0)

解决此问题的一种方法是使用子查询:

SELECT UserName, File
FROM YourTable
WHERE EventID = 560
  AND HandleID IN (
    SELECT HandleID 
    FROM YourTable 
    WHERE EventID = 564
  )