sql - 查询相关旧报表的表
问题描述
我回到这个问题。这是我的一些记录表:
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
当第一个报告连同它所携带的内容一起被结转时,它基本上得到一连串携带的报告ID。如果第一个报告没有被结转,那么它应该只返回那个报告。
建议的解决方案是:
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。
有什么建议么?
解决方案
我认为您可以使用以下查询来解决它
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
推荐阅读
- algorithm - 红黑树旋转:当我有 y = x.right; x.right = y.left。y.left.p = x 写成 x.right.p = x 一样吗
- typescript - 带有双爆炸符号的打字稿返回
- android - 如何在 Android 中使用 Camera2 API 拍摄多张照片而不进行预览?
- java - 如何在 Java 中创建一个接受字符串数组的 Spark UDF?
- sql - ORA-01745: 无效的主机/绑定变量名称
- c# - 继承上下文时避免从基本 EF Core 3.0 模型重新建模对象
- xamarin - Xamarin 表单上带有绿色边框的多个圆形图像作为地图引脚,Xamarin android Xamarin IOS
- keras - ValueError:无法将大小为 50176 的数组重塑为形状 (224,224,3)
- javascript - 我在反应中实施响应式的做法好吗?
- c# - 在 ASP NET Core Identity 中添加密码加密密钥