从子表

时间:2017-04-13 18:56:19

标签: sql

我们有记录(表1),它们具有通过在子表中插入记录而发生的工作流程(提交,批准等)(表2)。例如,如果提交了Table1中的记录,则会插入Table2中的相应记录,其中包含工作流状态(StatusField),日期和人员提交。当我尝试根据其状态(例如,仅提交的记录)查询Table1时,我试图找出最有效的方法并且不确定。我已经尝试创建函数,其中Table1的PK是参数,然后它从Table2中用匹配的FK踢出最新的Statusfield。我也尝试使用表2的PK为最大PK按FK分组,然后通过LEFT OUTER JOIN链接(因为表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'

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

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案(问题标记为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');