このスキーマが与えられた場合 (postgresql-9.2):
CREATE TABLE foo (
id serial PRIMARY KEY,
...other columns elided...
);
CREATE TYPE event_type AS ENUM ('start', 'stop');
CREATE TABLE foo_event (
id serial PRIMARY KEY,
foo_id integer NOT NULL REFERENCES foo (id),
timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
type event_type NOT NULL
);
すべての「実行中」を取得するにはどうすればよいfoo
ですか? つまり、foo
最新のイベントが「開始」であるfoo
s、またはさらに良いことに、少なくとも 1 回開始されstop
、最後のイベントの後に sがないstart
(将来さらにイベント タイプを追加する場合に備えて) s です。
これまでの私の最善の試みは次のとおりです。
SELECT * FROM foo
WHERE id NOT IN
(SELECT foo_id FROM foo_event
WHERE type='stop');
foo
もちろん、ここでの問題は、これまで停止されたことのある s が返されないことです。