Sql server 用于自引用表的SQL where子句

Sql server 用于自引用表的SQL where子句,sql-server,Sql Server,我有如下表格: CREATE TABLE [dbo].[Test] ( [Id] [int] IDENTITY(1,1) NOT NULL, [Title] [nvarchar](450) NULL, [Description] [nvarchar](4000) NULL, [Created] [datetime] NULL, [OrgId] [int] NULL CONSTRAINT [FK_Test_OrgId] FOREIGN KEY REFEREN

我有如下表格:

CREATE TABLE [dbo].[Test]
(
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Title] [nvarchar](450) NULL,
    [Description] [nvarchar](4000) NULL,
    [Created] [datetime] NULL,
    [OrgId] [int] NULL CONSTRAINT [FK_Test_OrgId] FOREIGN KEY REFERENCES Test(Id),

    CONSTRAINT [PK_Test] 
       PRIMARY KEY CLUSTERED ([Id] ASC)
) 
新条目具有
OrgId=null
。如果条目已被编辑,则会创建一个新行,并将
OrgId
设置为其原始父项。如果一个条目被编辑多次,则所有子条目的
OrgId
都将设置为原始行的Id。创建的日期时间提供“订单”

我需要做的是只选择最新版本

鉴于下表,我希望只选择Id 3、5和6

Id  Title   Description          Created        PreId
-----------------------------------------------------
1   Car     Orginal car          2014-01-01     NULL
2   House   Original house       2014-01-01     NULL
3   Bike    Original bike        2014-01-01     NULL
4   Car     Car updated          2014-06-01     1
5   Car     Car updated again    2014-08-01     1
6   House   house updated        2014-09-01     2
欢迎您的任何意见


谢谢。

因为所有记录都指向原始行(而不是前一行):


使用CTE检查分层查询并考虑将PRID更改为<代码> SyryIDID <代码>“原始配偶遗失”;我建议通过列创建一个有效的
列,以便在每次创建新的子条目时进行更新,这样就可以更容易地在
条款之间找到当前的有效数据。有趣的是,你能详细说明一下吗?我知道你每次更新条目时都会创建一个新条目,保留一些日志记录的旧值,以便以建议的方法获取最新值,您可以执行类似于
SELECT*fromtest WHERE GETDATE()的操作在创建和有效之间,通过
而不使用任何功能,如
MAX
TOP
,此解决方案应在高密度情况下运行良好,并且如果您有支持查询的正确索引。高密度意味着与表中的行数相比,没有多少不同的标题。如果有许多不同的标题,行数法应该会更好。感谢您的建议,但解决方案是基于标题相同,而它们不一定是相同的(我可以看到人们如何假设它们基于我的简单示例)。标题可以更改,描述也可以更改。哦,我明白了:-)谢谢您的响应,谢谢您为我输入的知识,但是上面的解决方案会为我返回除Id 4之外的所有行。但是,如果我删除ISNULL部分,那么我会得到我要找的结果集:)@Henrik您应该需要一个
ISNULL
部分。我不知道为什么Amir将id乘以-1 correct将
ISNULL(OrgID,id)
correct。我太仓促了,没有下结论说这是不必要的。关于-1,你是对的。我把它拿走了。。is null用于将原始记录与新版本分组。
SELECT ID, Title, DEscription, CREATED, PreID 
FROM
  (SELECT ID, Title, DEscription, CREATED, PreID, 
  ROW_NUMBER() over(partition by ISNULL(OrgID,id) order by id desc) rn 
  FROM test) A
where RN = 1
WITH Titles AS
(
  SELECT DISTINCT Title
  FROM dbo.Test
)
SELECT A.ID, Ti.Title, A.[Description], A.Created, A.OrgId
FROM Titles AS Ti
OUTER APPLY (SELECT TOP (1) ID, [Description], [Created], [OrgId]
             FROM dbo.Test AS Te
             WHERE Te.Title = Ti.Title
             ORDER BY Created DESC
            ) AS A;