使用引用父项的行查询优化

时间:2013-07-01 15:19:35

标签: sql

我有一个表有“Id”,“ParentId”和“CreatedDate”的表。如果该行是原始提交,则它将没有“ParentId”。当对原始提交进行编辑时,会在NewRow中创建一个新行。“ParentId”= Original。“Id”。从那里开始的每个新编辑都将采用适当的“ParentId”。这提供了一种查看编辑历史的方法。

现在进行查询。我一起搜索了一个将获得所有最新和唯一条目的查询。例如。如果我有3个独特的原始形式。我只想看到他们最近的版本(最近的孩子),除非他们没有,在这种情况下我想要原来的“ParentId”是空的。

这是我正在使用的查询:

SELECT DISTINCT A.* 
FROM   "dbo"."customercomplaint" AS A 
       RIGHT OUTER JOIN "dbo"."customercomplaint" AS B 
                     ON B."parentid" != A."id" 
WHERE  A."parentid" IS NULL 
       AND A."id" IS NOT NULL 
UNION 
SELECT t1.* 
FROM   "dbo"."customercomplaint" t1 
       JOIN (SELECT "parentid"         AS id, 
                    Max("createddate") AS "CreatedDate" 
             FROM   "dbo"."customercomplaint" 
             GROUP  BY id) t2 
         ON t1."parentid" = t2.id 
            AND t1."createddate" = t2."createddate" 

这个查询对我来说有点草率,我想找一个更好的解决方案。如果需要任何进一步的信息,请告诉我。我感谢任何建议。

1 个答案:

答案 0 :(得分:2)

您可以使用Row_Number()函数简化查询。

以下是一个示例和working demo

select ID, ParentID, CreatedDate
from (
        select ID, ParentID, CreatedDate, row_number() over(partition by isnull(ParentID, ID) order by CreatedDate desc) RowNumber
        from CustomerComplaint
   ) t
 where
    t.RowNumber = 1