2017-04-13 49 views
1

我们有记录(表1),他们拥有通过在子表(表2)中插入记录而发生的工作流(已提交,已批准等)。例如,如果提交了表1中的记录,则会插入表2中对应的具有工作流状态(StatusField),日期和提交人员的记录。当我然后尝试根据其状态(例如,仅提交的记录)查询Table1时,我试图找出最有效的方式并且不确定。我试过创建函数,其中Table1的PK是参数,然后使用匹配的FK从Table2中踢出最新的状态字段。我也尝试了用Table 2的PK来查看由FK分组的Max PK,然后通过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

一个可能的解决(问题是标签的MySQL) - 使用派生表来获取每个FK最大的DateField,然后再加入回表2,看是否statusfield提交....

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'); 
+0

该作品,不知道它还有多快,但很快就会测试。谢谢你这么快速的回应! – Julian

+0

加快速度的一种可能方法是使派生表最大化物理表并对其进行索引。这将加速与table1的连接,并允许table2通过索引(fk,datefield)直接连接到最大结果。祝你好运! – RMathis

+0

速度更快,谢谢! – Julian