0

スキーマとデータについて知っておくべきこと:

SELECT * FROM 'income';  -- Returns all 309 rows.
SELECT * FROM 'income' WHERE businessday_revision = 0;  -- 308 rows
SELECT * FROM 'income' WHERE businessday_revision = 1;  -- 1 row

営業日テーブルには次のものがあります。

id INTEGER,
revision INTEGER,
....
PRIMARY KEY(id, revision)

収入表には次のものがあります。

id                    -- integer primary key, quite unimportant I think
businessday_id        -- FK
businessday_revision  -- FK, when a day is edited, a new revision is created

外部キーは次のようになります。

FOREIGN KEY(businessday_id, businessday_revision) REFERENCES businessday(id, revision) ON DELETE CASCADE,

問題

各日の最新リビジョンからのみ収入を選択したい。これは 308 行である必要があります。 しかし、悲しいことに、私は密度が高すぎてそれを理解できません。これを使用して、すべての最新の営業日のリビジョンを取得できることがわかりました。

SELECT id, MAX(revision)
FROM businessday
GROUP BY id;

このデータを使用して収入を選択する方法はありますか? 次のようなもの:

-- Pseudo-code:
SELECT *
FROM income i
WHERE i.businessday_id = businessday.id THAT EXISTS IN
    (SELECT id, MAX(revision)
    FROM businessday
    GROUP BY id);

ここでは明らかに手がかりがありません。正しい方向に向けてください!

4

2 に答える 2

1

結合を使用するのはどうですか?

SELECT  i.*
FROM    income i
        INNER JOIN
        (
            SELECT  id, MAX(revision) revision
            FROM    businessday
            GROUP   BY id
        ) s ON i.businessday_id = s.id AND
                i.businessday_revision = s.revision
于 2013-06-28T02:55:37.927 に答える
1

これはうまくいくはずです:

SELECT i.*
FROM Income i
    INNER JOIN (
        SELECT id, MAX(revision) maxrevision
        FROM businessDay
        GROUP BY id
    ) t ON i.businessday_id = t.id AND i.businessday_revision = t.maxrevision
于 2013-06-28T02:55:43.860 に答える