2

私のソフトウェアはいくつかのデータベースで実行されるため、汎用的である必要があります(特に、「個別の」ソリューションが機能する可能性があると思いますが、それは標準ではありません)。

次のように定義された2つのテーブルがあるとします。

Table A: id, time (pk: id)
Table B: id(fk), key, value (pk: id, key)

ここで、テーブルBのIDはテーブルAの外部キーであり、主キーは指定されたとおりです。

要求されたキーの最新の(時間内の)値が必要です。したがって、次のようなデータがあるとします。

id | key | value
1  | A   | v1
1  | B   | v2
1  | C   | v3
2  | A   | v4
2  | C   | v5
3  | B   | v6
3  | D   | v7

idの時間が増加していて、キーAとCの値が必要な場合、次のような結果が期待されます。

key | value
A   | v4
C   | v5

またはキーDとAの場合:

key | value
D   | v7
A   | v4

理想的には、n個のキーリクエストに対してn行しか返されません。このようなことは単一のクエリで可能ですか?

4

2 に答える 2

2

これがSQLServer2008R2での動作です。

スキーマ

CREATE TABLE B (
   ind integer,
   [key] varchar(8),
   value varchar(16)
);

INSERT INTO B VALUES (1, 'A', 'v1');
INSERT INTO B VALUES (1, 'B', 'v2');
INSERT INTO B VALUES (1, 'C', 'v3');
INSERT INTO B VALUES (2, 'A', 'v4');
INSERT INTO B VALUES (2, 'C', 'v5');
INSERT INTO B VALUES (3, 'B', 'v6');
INSERT INTO B VALUES (3, 'D', 'v7');
INSERT INTO B VALUES (3, 'A', 'v12');
INSERT INTO B VALUES (3, 'C', 'v17');
INSERT INTO B VALUES (3, 'C', 'v101');

クエリ

select [key], max(CAST(SUBSTRING(value, 2, LEN(value)) as INT)) from B
where [key] in ('A', 'C')
group by [key]

vをプレフィックスとして保持する場合は、次のようにします。

select [key], 'v' + CAST(max(CAST(SUBSTRING(value, 2, LEN(value)) as INT)) as VARCHAR) as Value
from B
where [key] in ('A', 'C')
group by [key]

出力

| KEY |    VALUE |
------------------
|   A |      v12 |
|   C |     v101 |

遊ぶSQLフィドル:http ://sqlfiddle.com/#!3/9de72/1

于 2012-08-24T00:42:37.917 に答える
1

同じTIME値を持つID値はないと想定しています。

以下は、できるだけ多くのデータベースで実行するオプションを使用して取得できる限り一般的なものだと思います。ただし、プラットフォームの柔軟性とのトレードオフは、最適なパフォーマンスとは言えません。

エイリアスtのサブクエリは、各キーで使用可能な最新の時刻を識別します。

select a.id,
       a.time,
       b.key,
       b.value
  from tableB as b
  inner join tableA as a
    on a.id=b.id
  inner join (
      select b2.key,
             max(a2.time) time
        from tableB as b2
       inner join tableA as a2 on a2.id=b2.id
       group by b2.key
  ) as t on a.time = t.time and b.key = t.key
  where b.key in ('D','A')

WHERE句はサブクエリ内に移動でき、プリミティブオプティマイザを備えたデータベースでわずかにパフォーマンスが向上する可能性があります。ただし、WHERE句を外部クエリに配置すると、保守が容易になり、WHERE句なしでビューを作成できる可能性もあります。次に、WHERE句をビューからの選択に追加できます。

ROW_NUMBER()を使用したクエリの方が効率的ですが、OracleのKEEPLASTなどを使用したクエリの方が効率的です。ただし、これらの機能により、クエリは特定のプラットフォームに対してより制限されます。

于 2012-08-24T04:15:01.140 に答える