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;