无需第二个T-SQL查询

时间:2019-06-27 03:02:22

标签: c# asp.net sql-server

我正在将一些数据加载到来自两个表的转发器中。但是,针对第二个表的查询仅选择了MAX记录,由于这种复杂性,我不得不创建一个子转发器,然后关闭并找到要显示的Max记录。

表A:活动列表

ID  |  Activity
----+-----------------------
1   |  Change Oil Filter
2   |  Change brake fluid
3   |  Change brake rotors

表B:力学日志

ID | ActivityID  | Date        | Mechanic | Comment
---+-------------+-------------+-------------------------------------------
1  | 1           | 2019-27-06  | John     | Changed the oil filter
2  | 1           | 2019-26-06  | Sally    | No oil filters in stock.
3  | 2           | 2019-20-06  | Sally    | Brake fluid flushed.

如上所述,我可以使用两个中继器(一个在另一个内部)生成下表,它看起来像这样。

ActivityID   | Date        | Mechanic | Comment
-------------+-------------+-----------------------------------------
1            | 2019-27-06  | John     | Changed the oil filter
2            | 2019-20-06  | Sally    | Brake fluid flushed.    
3            |             |          |

我的问题是:如何仅使用一个转发器和1个T-SQL查询就可以生成相同的表?可能吗?原因是这是我必须为技工工作日志启用的完整列表的非常简单的列表(此示例已缩短),当我开始进行可以在车辆上进行的100多项活动时,该页面加载速度很慢;假设因为它必须为绑定的每个记录触发第二个转发器+代码。

我也很抱歉,我还没有一个“起点”可供您使用,因为我创建的任何内容都几乎无法在一个查询中产生结果。我在解决如何将查询的第一部分与第二个表的MAX(Date)结合起来时遇到麻烦。希望能得到社会的一些帮助。

3 个答案:

答案 0 :(得分:1)

您可以使用以下查询获得所需的结果-

样本数据

Declare @ActivityList Table
(ID int, Activity varchar(100))

Insert into @ActivityList
values
(1   ,  'Change Oil Filter'    ),
(2   ,  'Change brake fluid'     ),
(3   ,  'Change brake rotors'    )


Declare @MechanicsLog Table
(ID int, ActivityID int, [Date] Date, Mechanic varchar(20), Comment varchar(50))

Insert into @MechanicsLog
values
(1  , 1     ,      '2019-06-27'  , 'John'     , 'Changed the oil filter'   ),
(2  , 1     ,      '2019-06-26'  , 'Sally'    , 'No oil filters in stock.' ),
(3  , 2     ,      '2019-06-20'  , 'Sally'    , 'Brake fluid flushed.'     )

查询

;With cte as
(select ActivityID, Max([Date]) [date] from  @MechanicsLog ml
Group By ActivityID
)
Select al.ID, al.Activity, cte.[Date], Mechanic, Comment 
from cte inner join @MechanicsLog ml 
on cte.ActivityID = ml.ActivityID and cte.[date] = ml.[Date]
right join  @ActivityList al on al.ID = ml.ActivityID
order by ID

答案 1 :(得分:0)

如果添加时使用ROW_NUMBER函数向每个活动ID添加序列,则可以对其进行过滤,以仅获取每个活动ID的最新序列。

select ActivityID, Date, Mechanic, Comment 
from 
(
select *, ROW_NUMBER() OVER (PARTITION BY ActivityID order by Date desc) RowNumber
from MechanicsLog
) q1 
where RowNumber = 1

这将为您提供每个ActivityID的“ MAX”记录,但包含其余的记录,因此您可以根据需要加入“活动列表”表。

答案 2 :(得分:-1)

select 
    act.ActivityID, Max(log.[Date]) as [Date]
from 
    ActivityList act 
inner join 
    MachineLog log on log.ActivityID = act.ActivityID
Group by 
    act.ActivityID