Как получить перенесенные отчеты + самый первый отчет из следующей таблицы?
Результат должен быть: 304, 306, 309 и 312.
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
После небольшого изменения решения пришлось немного подправить, когда есть только один caseID.
INSERT [dbo].[test] ([reportID], [caseID], [carriedOver], [oldReportID])
VALUES (100, 1, 0, NULL)
GO
declare @caseID int = 1
SELECT t.reportID, tr.*, t.*
FROM dbo.test t
INNER JOIN ( SELECT ROW_NUMBER() OVER (ORDER BY reportID) AS RowNum,
reportID
FROM dbo.test
WHERE caseID = @caseID ) tr on tr.reportID = t.reportID
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 ) or
tr.rowNum < 2 )
and caseID = @caseID
ORDER BY 1 asc