1

テーブルDesignと、そのテーブルの というビューがありますArchivedDesign。ビューは次のように宣言されます。

CREATE OR REPLACE VIEW public."ArchivedDesign" ("RootId",  "Id", "Created", "CreatedBy", "Modified", "ModifiedBy", "VersionStatusId", "OrganizationId")
AS
SELECT DISTINCT ON (des."RootId") "RootId", des."Id", des."Created", des."CreatedBy", des."Modified", des."ModifiedBy", des."VersionStatusId", des."OrganizationId"
FROM public."Design" AS des
JOIN public."VersionStatus" AS vt ON des."VersionStatusId" = vt."Id"
WHERE vt."Code" = 'Archived'
ORDER BY "RootId", des."Modified" DESC;

次に、最新の変更、サムネイルなどの短い要約を取得する大きなクエリがあります。クエリ全体は重要ではありませんが、2 つのほぼ同一のサブクエリが含まれています。1 つはメイン テーブル用で、もう 1 つはビュー用です。

SELECT DISTINCT ON (1) x."Id",
                TRIM(con."Name") AS "Contributor",
                extract(epoch from x."Modified") * 1000 AS "Modified",
                x."VersionStatusId",
                x."OrganizationId"
FROM public."Design" AS x
JOIN "Contributor" AS con ON con."DesignId" = x."Id"
WHERE x."OrganizationId" = ANY (ARRAY[]::uuid[])
AND x."VersionStatusId" = ANY (ARRAY[]::uuid[])
GROUP BY x."Id", con."Name"
ORDER BY x."Id";

SELECT DISTINCT ON (1) x."Id",
                TRIM(con."Name") AS "Contributor",
                extract(epoch from x."Modified") * 1000 AS "Modified",
                x."VersionStatusId",
                x."OrganizationId"
FROM public."ArchivedDesign" AS x
JOIN "Contributor" AS con ON con."DesignId" = x."Id"
WHERE x."OrganizationId" = ANY (ARRAY[]::uuid[])
AND x."VersionStatusId" = ANY (ARRAY[]::uuid[])
GROUP BY x."Id", con."Name"
ORDER BY x."Id";

SQL フィドルへのリンク: http://sqlfiddle.com/#!17/d1d0f/1

クエリはテーブルに対して有効ですが、ビューに対してはエラーで失敗しますcolumn x."Modified" must appear in the GROUP BY clause or be used in an aggregate function。これら 2 つのクエリの動作に違いがある理由がわかりません。テーブル クエリと同じようにビュー クエリを修正するにはどうすればよいですか?

私の最終的な目標は、すべてのテーブル サブクエリをビュー サブクエリに置き換えて、ドラフト、アクティブ、およびアーカイブされたデザインを簡単に分離できるようにすることです。

4

1 に答える 1