多表连接需要每侧的最大版本

时间:2014-06-17 23:46:31

标签: sql join optimization

所以我有两个表T1和T2 - 最初只有一个表有一个“版本”字段,现在他们都这样做了,我需要两者之间的连接才能解决这个问题。

T1 {
modifyTime dateTime
id int
version int
ruleId int
.....
} 

T2 {
modifyTime DateTime
id int
version int
.....
}

我的旧查询是:

SELECT t1.*, t2.* 
FROM table1 t1 
LEFT JOIN table2 t2 ON t1.ruleid = t2.id 
JOIN (SELECT max(version) AS version,id 
      FROM t1 GROUP BY id) b ON t1.id=b.id AND t1.version=b.version

现在我需要相同的查询,但也要考虑T2上的最大版本。尝试添加另一个像第三个JOIN,但没有返回任何东西。此外,T2中的条目可能为空,我的意思是T1.ruleId可能为空。

1 个答案:

答案 0 :(得分:1)

您没有说明您正在使用哪种RDBMS。如果您支持WITH子句,那么可能会使语句更清晰。

无论如何,我认为你走在了正确的轨道上。 ruleId可能NULL使事情变得复杂,但something like this (Fiddle)应该有效:

SELECT t1.*, t2.*
 FROM (SELECT t1.*
         FROM t1
         JOIN (SELECT id, MAX(version) AS "VERSION"
                 FROM t1
                GROUP BY id) MAX_T1  ON MAX_T1.id = t1.id 
                                    AND MAX_T1.version = t1.version
      ) t1
 LEFT JOIN (SELECT t2.*
              FROM t2
              JOIN (SELECT t2.id, MAX(t2.version) AS "VERSION"
                      FROM t2
                     GROUP BY t2.id) MAX_T2  ON MAX_T2.id = t2.id 
                                            AND MAX_T2.version = t2.version
           ) t2 ON t2.id = t1.ruleId
;