2014-09-12 2 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 비트를받습니다. 그들이 응답하지 않은 다음 회사 (계급 및 그룹 ID에 따라)에 응답하면 OnTop 비트가 true로 설정됩니다. OnTop 플래그가있는 회사가 응답하지 않는 경우 (순위 및 그룹 ID에 따라) 회사를 찾지 않습니다.

커서를 사용하여이 문제를 해결할 수 있지만 EF 마이그레이션에서 사용되므로 이전 레코드를 새 OnTop 플래그로 업데이트하는 하나의 문장이어야합니다. 나는 내부 조인을 시도하고 시간과 순위가 낮지 만 현재 게시물 위의 그룹 전체 트리에 대해 계산하지 않는지 살펴 보았습니다. 아이디어 나 코드 제안은 대단히 감사하겠습니다.

답변

0

SQL Server에서 재귀 관계를 사용하려면 가장 좋은 방법은 Common Table Expressions을 사용하는 것입니다. 그것들은 재귀 적으로 나무를 탐색하는 데 사용될 수 있습니다.

커서 사용도 옵션입니다. 내가 아는 한, 마이그레이션 중에 호출 할 수있는 SQL 문의 길이/크기/복잡성에는 제한이 없습니다.

0

특정 데이터베이스에 대한 마이그레이션을 수행하기 전에 테이블에서 최대 레벨 수를 확인하고 많은 자체 조인을 만들 수 있습니다.

관련 문제