多Task表与Entity表关联查询:单实体多任务按时间排序实现
如何关联多任务表查询指定实体的所有任务并按时间排序?
没问题,当然可以做到!先梳理下你的场景:你有个Entity表,主键是int类型的ID;还有一堆任务表(Task1、Task2、Task3…),每个任务表除了自己独有的字段,都共享三个公共属性:时间字段(比如Task1里叫timestamp,其他表是time_created,都是datetime2(7)类型,默认getdate())、各自的int主键,以及关联Entity表的外键ID_Entity。比如Task1的建表语句是这样的:
CREATE TABLE [dbo].[Task1] ( [ID_Task1] [int] IDENTITY(1,1) NOT NULL, [describer] [nvarchar](30) NOT NULL, [ID_Entity] [int] NOT NULL, [timestamp] [datetime2](7) NOT NULL, [individual_task_value] [float] NOT NULL, CONSTRAINT [PK_Task1] PRIMARY KEY CLUSTERED ([ID_Task1] ASC) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO ALTER TABLE [dbo].[Task1] ADD CONSTRAINT [DF_Task1_timestamp] DEFAULT (GETDATE()) FOR [timestamp] GO ALTER TABLE [dbo].[Task1] WITH CHECK ADD CONSTRAINT [FK_Task1_Entity] FOREIGN KEY([ID_Entity]) REFERENCES [dbo].[Entity] ([id]) GO ALTER TABLE [dbo].[Task1] CHECK CONSTRAINT [FK_Task1_Entity] GO
要获取指定实体(比如ID=1)的所有任务并按时间排序,最直接的方法是用UNION ALL把各个任务表的查询结果合并起来,因为每个任务表都能映射到你需要的统一列结构。
具体查询语句
-- 从Task1取数据,映射到目标列 SELECT ID_Entity AS ID_ENTITY, [timestamp] AS DATETIME, 'task1' AS TASK, ID_Task1 AS TASK_ID FROM dbo.Task1 WHERE ID_Entity = 1 -- 合并Task2的数据 UNION ALL SELECT ID_Entity AS ID_ENTITY, time_created AS DATETIME, 'task2' AS TASK, ID_Task2 AS TASK_ID FROM dbo.Task2 WHERE ID_Entity = 1 -- 合并Task3的数据 UNION ALL SELECT ID_Entity AS ID_ENTITY, time_created AS DATETIME, 'task3' AS TASK, ID_Task3 AS TASK_ID FROM dbo.Task3 WHERE ID_Entity = 1 -- 如果有更多任务表,继续添加UNION ALL对应的子查询即可 -- 最后按时间排序 ORDER BY DATETIME ASC;
关键说明
- UNION ALL的选择:用
UNION ALL而不是UNION,因为不同任务表的记录属于不同任务类型,不会有重复数据,UNION ALL不需要做去重操作,性能更好。 - 列的一致性:每个子查询必须返回相同数量、相同数据类型的列,所以我们把每个任务表的字段统一映射到
ID_ENTITY、DATETIME、TASK、TASK_ID这四个列,其中TASK是手动指定的任务类型字符串,方便区分来源表。 - 时间字段的别名:注意Task1的时间字段叫
timestamp,其他任务表是time_created,所以在子查询里要统一别名为DATETIME,保证列名一致。 - 扩展性:如果后续新增Task4、Task5这类任务表,只需要在查询里添加对应的
UNION ALL子查询即可,逻辑非常直观。
如果你的任务表数量特别多,不想手动写每个子查询,也可以用动态SQL自动生成查询,但静态的UNION ALL写法更简单易懂,维护起来也方便。
内容的提问来源于stack exchange,提问作者user6715722
相关产品推荐
相关产品推荐

