【问题标题】:performing a join operation and filter records according to the MAX value of a partucular column根据特定列的 MAX 值执行连接操作并过滤记录
【发布时间】:2014-04-01 05:53:49
【问题描述】:

在以下情况下我需要一些帮助,

我有两张桌子,

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 的行。

有人可以给我建议吗?

提前致谢!

【问题讨论】:

    标签: sql oracle join groupwise-maximum


    【解决方案1】:

    这样的事情应该可以工作:

    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
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        【解决方案3】:

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

        WITH allorders AS (
          SELECT *
          FROM MESSAGE_CONTEXT_TABLE msg
          JOIN PACKAGE_INFO_TABLE    pkg ON (pkg.PACKAGE = msg.PACKAGE)
        )
        , maxorders AS (
          SELECT aux.CONTEXT_ID, MAX(aux.PACKAGE_ORDER) AS max_PACKAGE_ORDER
          FROM allorders aux
          GROUP BY aux.CONTEXT_ID
        )
        SELECT *
        FROM allorders aor
        WHERE EXISTS (
          SELECT 'x'
          FROM maxorders mor
          WHERE aor.CONTEXT_ID    = mor.CONTEXT_ID
            AND aor.PACKAGE_ORDER = mor.max_PACKAGE_ORDER
        );
        

        我为此查询创建了一个fiddle

        【讨论】:

        • 这是查询的结构吗?我无法运行它(尽管尝试了不同的更改)
        • 嗨,@pragan,对不起,我之前没有检查过语法。我为它创建了一个小提琴,因此您可以添加一些数据并查看结果是否符合预期。
        • 谢谢。但是我仍然无法通过查询获得我想要的结果。样本数据,MESSAGE_CONTEXT_TABLE CONTEXT_ID NAME DESCRIPTION PACKAGE 1 Context_1 Context_1 pkg_1 2 Context_1 Context_1 pkg_2 3 Context_3 Context_3 pkg_1 PACKAGE_INFO_TABLE PACKAGE DESCRIPTION PACKAGE_ORDER pkg_1 Package 1 1 pkg_2 Package 2 2 样本结果集,CONTEXT_ID NAME PACKAGE PACKAGE_ORDER 1 Context_1 pkg_1 1 2 Context_2 pkg_2 2 3 Context_3 pkg_1 1 如果我们取前两行,我只需要这两行中的第二行
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-15
        • 2017-04-23
        • 2018-11-13
        • 1970-01-01
        • 2016-04-29
        • 2016-04-05
        • 1970-01-01
        相关资源
        最近更新 更多