执行连接操作并根据特定列的MAX值过滤记录

时间:2014-02-28 09:49:58

标签: sql oracle join groupwise-maximum

我需要以下方案提供一些帮助,

我有两张桌子,

MESSAGE_CONTEXT_TABLE (CONTEXT_ID,NAME,DESCRIPTION,PACKAGE) PK(CONTEXT_ID,PACKAGE)
PACKAGE_INFO_TABLE (PACKAGE,DESCRIPTION,PACKAGE_ORDER) PK (PACKAGE_NAME)

我需要在这些表上执行连接。当有多个记录具有相同的CONTEXT_ID(但具有不同的PACKAGE)时,我需要获取与PACKAGE_INFO_TABLE中的最大PACKAGE_ORDER相对应的行。

有人可以建议我吗?

提前致谢!

3 个答案:

答案 0 :(得分:0)

这样的事情应该有效:

SELECT * 
FROM MESSAGE_CONTEXT_TABLE tm
     INNER JOIN PACKAGE_INFO_TABLE tp ON tm.package = tp.package
WHERE tp.package_order >= ALL (SELECT tp1.PACKAGE_ORDER
                               FROM MESSAGE_CONTEXT_TABLE tm1
                                    INNER JOIN PACKAGE_INFO_TABLE tp1 ON tm1.package = tp1.package
                               WHERE tm1.context_id = tm.context_id)

或者这样:

SELECT tm.*, tp.*
FROM MESSAGE_CONTEXT_TABLE tm
     INNER JOIN PACKAGE_INFO_TABLE tp ON tm.package = tp.package
     LEFT JOIN PACKAGE_INFO_TABLE tp1 ON tm.package = tp1.package
                                         AND tp1.package_order > tp.package_order
WHERE tp1.package_order IS NULL

答案 1 :(得分:0)

SELECT  mct.Context_ID, MAX(pit.Package_Order)
FROM Package_Info_Table pit
INNER JOIN MESSAGE_CONTEXT_TABLE mct
ON mct.Context_ID = pit.Context_ID
AND mct.Package <> pit.package

答案 2 :(得分:0)

以下解决方案使用两个CTE。第一个(allorders)加入两个表,而不用担心PACKAGE_ORDER。第二个(maxorders)使用前一个结果获取每个上下文ID的最大包顺序。主查询返回allorders中存在CONTEXT_IDPACKAGE_ORDER的{​​{1}}行:

maxorders

我为此查询创建了fiddle