Запрос таблицы для связанных старых отчетов - PullRequest
0 голосов
/ 03 апреля 2019

Я вернулся к этой проблеме. Вот моя таблица с некоторыми записями:

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.

Есть предложения?

1 Ответ

1 голос
/ 04 апреля 2019

Я думаю, что вы можете решить это с помощью следующего запроса

    DECLARE @caseID INT = 4
    DECLARE @ftrptID INT = (Select MIN(reportID) from dbo.test where caseID=@caseID )
    if EXISTS(Select 1 from dbo.test where carriedOver=1 and reportID=@ftrptID)
    BEGIN
        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
    END
    ELSE

        SELECT t.reportID
        FROM dbo.test t
        where reportID=@ftrptID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...