Выберите перенесенные отчеты - PullRequest
0 голосов
/ 25 марта 2019

Как получить перенесенные отчеты + самый первый отчет из следующей таблицы?

Результат должен быть: 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

1 Ответ

2 голосов
/ 25 марта 2019

Вы можете использовать EXISTS:

select t.*
from test t 
where exists (select 1 from test t1 where t.oldreportid = t1.reportid) or
      exists (select 1 from test t1 where t1.oldreportid = t.reportid);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...