按主键分组时如何最好地从其他表中选择项目

时间:2019-02-08 17:57:32

标签: sql-server tsql

几次发生以下情况,我的解决方案感觉很粗糙。

一般来说,我有一个可能看起来像这样的表:

WorkOrder:
    WorkOrderID (primary key)
    WorkOrderDesc

Process:
   ProcessID (primary key)
   ProcessDesc

Work:
   ProcessID
   WorkOrderID

我想找出一个工单上已经完成了多少个流程,所以我要做类似的事情

select w.WorkOrderId,w.ProcessID,Count(*)
from Work as w
    inner join WorkOrder as wo on w.WorkOrderID=wo.WorkOrderID
    inner join Process as p on w.ProcessID = p.ProcessID
group by w.WorkOrderID,w.ProcessID

此代码将告诉我每个工作订单上每个流程运行了多少次。

我遇到的问题是,我真的不希望查询结果成为索引,我希望它成为描述,因为这些将被报告或绘制。因为这是一个分组依据,所以我知道 WorkOrderID ProcessID 是唯一的,我知道所有描述都是相同的,因此我可以采用这些条目的最大值(或最小值)。

select w.WorkOrderId,w.ProcessID,Count(*),Max(w.WorkOrderDesc),Max(p.ProcessDesc)
from Work as w
    inner join WorkOrder as wo on w.WorkOrderID=wo.WorkOrderID
    inner join Process as p on w.ProcessID = p.ProcessID
group by w.WorkOrderID,w.ProcessID

此查询为我提供的ID类似于第一个查询,但它也填写了说明。

有没有一种方法可以在不使用此技巧的情况下将这种类型的查询作为单个查询进行?我知道我可以使用CTE,将第一个查询的结果第二次加入,以从两个表中获取描述,但看来最终还是再次运行相同的查询。

查询引擎似乎可以检测到我正在按主键分组,并允许我从select语句的那一行中选择项目。

注意:我意识到我可以仅通过使用这个玩具示例中的描述来完成查询,在一个实际示例中,每个查询都将在查询中报告很多项目,这些项目全部来自联接表。

1 个答案:

答案 0 :(得分:1)

我会这样写查询:

SELECT wo.WorkOrderDesc, p.ProcessDesc, x.Cnt
FROM (
    SELECT w.WorkOrderId,w.ProcessID,Count(*) AS Cnt
    from Work as w
    group by w.WorkOrderID,w.ProcessID
) x
inner join WorkOrder as wo on x.WorkOrderID=wo.WorkOrderID
inner join Process as p on x.ProcessID = p.ProcessID

通过这种方式,分组是使用ID完成的,但是我们稍后会检索结果中出现的每个ID的描述。