CTE查询未返回重复行

时间:2016-03-22 09:52:40

标签: sql sql-server common-table-expression

出于审计目的,我使用触发器将更改插入到审计表中。然后我使用CTE递归获取特定项目的所有审计行。

这个SQLFiddle添加了一些审核行和我正在使用的CTE。

这是CTE:

;WITH cteAudit AS
(
    SELECT id, [user_name], date_time, item_parent_type, item_parent_id, 
        item_type, item_id, item_action, row_guid, 1 AS audit_level
    FROM audit
    WHERE 
        (item_type = 22 AND item_id = 925) 
    UNION ALL
    SELECT a.id, a.[user_name], a.date_time, a.item_parent_type, a.item_parent_id, 
          a.item_type, a.item_id, a.item_action, a.row_guid, cteAudit.audit_level + 1
    FROM audit a
        INNER JOIN cteAudit
            ON a.item_parent_id = cteAudit.item_id
            AND a.item_parent_type = cteAudit.item_type
    WHERE 
        a.item_parent_type <> a.item_type AND
        a.item_parent_id <> a.item_id   
)

SELECT
    cteAudit.id,
    cteAudit.[user_name],
    cteAudit.date_time,
    cteAudit.item_parent_id,
    @itemtype AS item_type,
    cteAudit.item_id,
    item_action,
    cteAudit.audit_level,
    CONVERT(nvarchar(36), cteAudit.row_guid) AS row_guid
ORDER BY date_time DESC, audit_level desc

然而,有了这个CTE,我有两个问题:

  1. 查询不会返回所有13行。它不显示第11-13行。这是因为主表(客户)未被审核,因为用户刚刚更改了联系人的地址。
  2. 这是因为我修改了第3级(联系人),并且此级别有第2级链接(联系人列表。但是第2级,其中包含到第1级(客户)的链接)未被修改,因此不在审计表中,因此没有第一级的链接。

    1. 查询返回重复记录。
    2. 如何返回主表的所有行?为什么查询会返回重复的行?

1 个答案:

答案 0 :(得分:0)

您的问题来自不正确的查询或不正确的数据。

您要求递归查询这些约束:

WHERE 
        a.item_parent_type <> a.item_type AND
         a.item_parent_id <> a.item_id

但是对于第11行,第13行,item_parent_id等于item_id

你也要求 AND a.item_parent_type = cteAudit.item_type 但对于第11-13行,您的类型会被翻转,因此不正确。