4

開始日、中間日、終了日の3つの日付フィールドを持つテーブルがあります。テーブルから最新のアクティビティを取得するための単一のクエリを作成したいと思います。この場合のアクティビティは、日付フィールドが更新されたときです。

3つの個別のクエリを記述してから、コード内の値を組み合わせて最新の10個のアクティビティを取得することなく、1つのクエリでこれを実行できますか。だから今私は持っています

    SELECT TOP 10 * FROM core_table 
    ORDER BY [start_date] Desc

    SELECT TOP 10 * FROM core_table 
    ORDER BY [process_date] Desc

    SELECT TOP 10 * FROM core_table 
    ORDER BY [archive_date] Desc

したがって、これら3つのクエリの結果をまとめて、3つの日付すべてに基づいて上位10のエントリを取得したいと思います。

4

3 に答える 3

9

Itiong_shによって与えられた回答に基づいていますが、これはまったく同じではありません。ORDERBYで実行できます。

select top 10 * from core_table
order by
  CASE
      WHEN start_date >= process_date AND start_date >= archive_date 
          THEN  start_date
      WHEN process_date >= archive_date 
          THEN  process_date
      ELSE  archive_date
  END
 DESC
于 2012-05-12T23:35:16.433 に答える
2

RaphaëlAlthausの回答の拡張:

CREATE TABLE core_table (
    ...
    max_date AS
        CASE
            WHEN start_date >= process_date AND start_date >= archive_date
                THEN start_date
            WHEN process_date >= archive_date
                THEN process_date
            ELSE archive_date
        END
);

CREATE INDEX core_table_ie1 ON core_table (max_date);

次に、あなたは簡単に...

SELECT TOP 10 *
FROM core_table
ORDER BY max_date DESC;

...そして、全表スキャンの代わりにインデックス範囲スキャンを使用する必要があります。

于 2012-05-13T01:44:00.643 に答える
2

私はあなたが必要だと思いますUNION

SELECT TOP 10               
    *
FROM
    (   ( SELECT TOP 10 
              *, start_date    AS activity_date
          FROM core_table 
          ORDER BY [start_date] DESC
        ) 
    UNION
        ( SELECT TOP 10 
              *, process_date  AS activity_date
          FROM core_table 
          ORDER BY [process_date] DESC
        ) 
    UNION
        ( SELECT TOP 10 
              *, archive_date  AS activity_date
          FROM core_table 
          ORDER BY [archive_date] DESC
        )
    ) AS t
ORDER BY activity_date DESC ;
于 2012-05-12T23:43:50.373 に答える