3

私のベーステーブルの構造は次のようになります。

CREATE TABLE EXAMPLE_TABLE
{
ID NUMBER NOT NULL,
-- その他の列はこちら,
CREATE_USER VARCHAR2(255 BYTE) NOT NULL,
CREATE_DATE DATE DEFAULT SYSDATE NOT NULL,
UPDATE_USER VARCHAR2(255 BYTE),
UPDATE_DATE DATE
}

私がしたいのは、update_date または create_date が最も高い行の ID を選択することです。したがって、次のようなものです (これは機能しませんが、pID はストアド プロシージャの out 変数として定義されます)。

SELECT ID, MAX(GREATEST(CREATE_DATE, UPDATE_DATE) as LAST_MODIFIED
FROM EXAMPLE_TABLE
RETURNING ID INTO pID;

これは、基本的に、テーブルで変更された最後の行の 1 つの ID を返します。少し助けて?

PS これは Oracle11g にあります。現在、MERGE を使用して行をテーブルにアップサートし、このメソッドを使用して最後にアップサートされた行の ID を取得しています。これについて建設的な批判がある場合 (別の解決策がある可能性があります)、私はすべて耳を傾けます。なぜこれが良い/悪いのかについて、私は多くの議論を読みました。この手順を C# で呼び出すので、その他のヒントを教えていただければ幸いです。

4

2 に答える 2

3

あなたが望む構造はこれだと思います:

select id
from (SELECT ID
      FROM EXAMPLE_TABLE
      order by GREATEST(CREATE_DATE, UPDATE_DATE) desc
     )
where rownum = 1

ただし、日付の1つがNULLになる可能性があると思います。もしそうなら:

select id
from (SELECT ID
      FROM EXAMPLE_TABLE
      order by coalesce(GREATEST(CREATE_DATE, UPDATE_DATE), CREATE_DATE) desc
     )
where rownum = 1

これらのクエリは、各行の 2 つの値のうち大きい方で並べ替えてから、最大値を選択します。

于 2013-06-05T23:19:03.873 に答える
1

すべての日付フィールドを含むすべての ID の複合を作成し、最初のフィールドのみを取得するために rownum 制限で最大化します。

WITH A AS (
    SELECT ID, Max(FirstDateField) AS value
    FROM TableName
                WHERE ROWNUM=1
                GROUP BY ID
                ORDER BY Max(FirstDateField) DESC
    UNION ALL
    SELECT ID, Max(SecondDateField) AS value
    FROM TableName
                WHERE ROWNUM=1
                GROUP BY ID
                ORDER BY Max(SecondDateField) DESC
)
SELECT ID 
FROM A
WHERE ROWNUM=1
ORDER BY Value DESC
于 2013-06-05T23:16:54.917 に答える