Я вернулся к этой проблеме. Вот моя таблица с некоторыми записями:
CREATE TABLE [dbo].[test](
[reportID] [int] NOT NULL,
[caseID] [int] NOT NULL,
[carriedOver] [bit] NULL,
[oldReportID] [int] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[test] ([reportID], [caseID], [carriedOver], [oldReportID])
VALUES (304, 4, 1, NULL)
GO
INSERT [dbo].[test] ([reportID], [caseID], [carriedOver], [oldReportID])
VALUES (305, 4, 0, NULL)
GO
INSERT [dbo].[test] ([reportID], [caseID], [carriedOver], [oldReportID])
VALUES (306, 4, 1, 304)
GO
INSERT [dbo].[test] ([reportID], [caseID], [carriedOver], [oldReportID])
VALUES (309, 4, 1, 306)
GO
INSERT [dbo].[test] ([reportID], [caseID], [carriedOver], [oldReportID])
VALUES (311, 4, 0, NULL)
GO
INSERT [dbo].[test] ([reportID], [caseID], [carriedOver], [oldReportID])
VALUES (312, 4, 1, 309)
GO
INSERT [dbo].[test] ([reportID], [caseID], [carriedOver], [oldReportID])
VALUES (100, 1, 0, NULL)
GO
INSERT [dbo].[test] ([reportID], [caseID], [carriedOver], [oldReportID])
VALUES (418, 8, 0, NULL)
GO
INSERT [dbo].[test] ([reportID], [caseID], [carriedOver], [oldReportID])
VALUES (436, 8, 1, NULL)
GO
INSERT [dbo].[test] ([reportID], [caseID], [carriedOver], [oldReportID])
VALUES (438, 8, 0, 436)
GO
Желаемый вывод выглядит следующим образом:
Для CaseID = 4 я должен получить идентификаторы ReportID: 304, 306, 309 и 312
Для CaseID = 1 я должен получить только ReportID: 100
Для CaseID = 8, я должен получить только ReportID: 418
В основном получается цепочка переносимых идентификаторов отчета, когда первый отчет переносится вместе с тем, во что он переносится. Если первый отчет не переносится, он должен возвращать только этот отчет.
Предлагаемое решение было:
declare @caseID int = 4
SELECT t.reportID
FROM dbo.test t
WHERE ( exists ( SELECT 1 FROM dbo.test t1 WHERE t1.reportID = t.oldReportID and t1.caseID = @caseID ) or
exists ( SELECT 1 FROM dbo.test t2 WHERE t2.oldReportID = t.reportID and t2.caseID = @caseID ) )
and caseID = @caseID
ORDER BY 1 asc
Это прекрасно работает для CaseID = 4, но не работает для CaseID = 1 или CaseID = 8.
Есть предложения?