从子表获取状态的最有效方法

  • 本文关键字:有效 方法 状态 获取 sql
  • 更新时间 :
  • 英文 :


我们有记录(表1),这些记录的工作流(已提交、已批准等)通过在子表(表2)中插入记录来实现。例如,如果提交了表 1 中的记录,则会在 Table2 中插入相应的记录,该记录具有工作流状态(状态字段)、日期和提交人员。然后,当我尝试根据其状态(例如仅提交的记录)查询 Table1 时,我试图找出最有效的方法并且不确定。我尝试创建函数,其中 Table1 的 PK 是参数,然后它使用匹配的 FK 从 Table2 中踢出最新的状态字段。我还尝试使用表2的PK为按FK分组的最大PK制作视图,然后通过左外部连接链接(因为表2中可能没有相应的记录,这意味着状态为待处理)。看起来更快的方法是像这样执行子查询:

SELECT a.*
,(SELECT TOP 1 StatusField 
FROM Table2 b
WHERE b.FK=a.PK
ORDER BY b.DateField DESC) StatusField
FROM Table1 a
WHERE (SELECT TOP 1 StatusField 
FROM Table2 b
WHERE b.FK=a.PK
ORDER BY b.DateField DESC)='Submitted'

我仍然觉得有更好的方法。有什么想法吗?如果有类似的问题和答案有人可以指出我,那也很棒。谢谢!

一种可能的解决方案(问题被标记为MySQL) - 使用派生表获取每个fk的最大日期字段,然后连接回table2以查看状态字段是否已提交。

select a.*
, b.StatusField
from table1 a
join (select fk
, max(datefield) datefield
from table2
group by fk) max on (max.fk = a.fk)
join table2 b on (b.fk = a.fk and b.datefield = max.datefield) and b.StatusField = 'Submitted'); 

最新更新