2014-09-12 62 views
0

我需要使用布尔标志更新表中的选择。下面是一个例子,显示了我想要的。选择具有依赖关系的记录

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[Answers2](
    [GroupID] [int] NOT NULL, 
    [CompanyID] [int] NOT NULL, 
    [RankID] [int] NOT NULL, 
    [AnswerTime] [datetime] NULL, 
    [OnTop] [bit] NOT NULL 
) ON [PRIMARY] 
GO 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (9, 1, 1, NULL, 1) 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (10, 1, 1, CAST(0x0000A3A400C5C100 AS DateTime), 1) 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (10, 2, 2, CAST(0x0000A3A400D63BC0 AS DateTime), 1) 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (10, 3, 3, CAST(0x0000A3A400CDFE60 AS DateTime), 0) 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (10, 4, 4, CAST(0x0000A3A400E6B680 AS DateTime), 1) 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (10, 5, 5, NULL, 1) 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (10, 6, 6, CAST(0x0000A3A400F73140 AS DateTime), 0) 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (11, 1, 1, CAST(0x0000A3A400D63BC0 AS DateTime), 1) 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (11, 2, 2, CAST(0x0000A3A400C5C100 AS DateTime), 0) 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (11, 3, 3, CAST(0x0000A3A400CDFE60 AS DateTime), 0) 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (11, 4, 4, CAST(0x0000A3A400E6B680 AS DateTime), 1) 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (11, 5, 5, CAST(0x0000A3A400EEF3E0 AS DateTime), 1) 
INSERT [dbo].[Answers2] ([GroupID], [CompanyID], [RankID], [AnswerTime], [OnTop]) VALUES (12, 1, 1, CAST(0x0000A3A400F73140 AS DateTime), 1) 

逻辑如下。 问题是一次发送给一个或多个公司。如果一家公司的排名最高,它会设置OnTop位。当他们回答下一个公司时(根据rank和groupID),没有回答会将OnTop位设置为true。如果一家拥有OnTop旗子的公司从未回答过任何一家公司(根据rank和groupid),他们将会得到它。

我可以使用游标来解决这个问题,但是这将用于EF迁移,因此它必须是一个用新的OnTop标志更新所有旧记录的语句。 我试图做一个内部连接本身,看时间和等级是否较低,但不包括当前文章上方的整个树。 任何想法或codesuggestions将非常感激?

回答

0

要在SQL Server中使用递归关系,最好的方法是使用Common Table Expressions。它们可以用于递归遍历树。

使用光标也是一个选项。据我所知,在迁移过程中可以调用的SQL语句的长度/大小/复杂性没有限制。

0

如果您正在为特定数据库执行迁移,则可以事先检查表中的最大级别数并进行多次自加入。