0

次のシナリオについて支援が必要です。

私は2つのテーブルを持っています、

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 に対応する行を取得する必要があります。

誰かが私に方法を提案できますか?

前もって感謝します!

4

3 に答える 3

0

次のソリューションでは、2 つの CTE を使用します。最初の ( allorders) は、 を気にせずに両方のテーブルを結合しPACKAGE_ORDERます。2 番目 ( maxorders) は、前の結果を使用して、各コンテキスト ID の最大パッケージ順序を取得します。メイン クエリは、 whichおよびexist inの行allordersを返します。CONTEXT_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
);

このクエリのフィドルを作成しました。

于 2014-02-28T10:34:59.000 に答える
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
于 2014-02-28T09:56:07.900 に答える