CREATE OR REPLACE FUNCTION public.fn_question_3_3()
RETURNS TABLE(name character varying, surname character varying, person_t person_type)
AS
$$
DECLARE
pt person_type;
BEGIN
RETURN QUERY
SELECT DISTINCT pr.name, pr.surname, pr.person_t
FROM "Person" pr
CROSS JOIN "Professor" prof
CROSS JOIN "LabTeacher" lt
CROSS JOIN "Student" st;
IF pr.amka = prof.amka THEN
pt = 'Professor';
ELSIF pr.amka = lt.amka THEN
pt = 'LabTeacher';
ELSE
pt = 'Student';
END IF;
pt = pr.person_t;
END;
$$
LANGUAGE 'plpgsql';
SELECT*FROM fn_question_3_3()
所以我试图在这里做一个简单的查询,我检查这个人的 amka,如果它与其他表之一相同,那么它更新 person_t 列并返回姓名、姓氏和 person_t。
问题是查询SELECT * FROM fn_wuestion_3_3()
需要超过 10 分钟才能完成,而对于这样的查询,情况不应该如此。任何帮助将不胜感激,因为我对数据库和 postgresql/pgadmin4 很陌生。
表:“Person”有 4820 行
表:“Professor”有 123 行
表:“LabTeacher”有 77 行
表:“Student”有 3194 行
索引定义分别为“Person”的 pr、“Professor”的 prof、“Student”的 st 和“LabTeacher”表的 lt。
为什么在查询中包含表“Student”?除了
from
. 不要包括您不使用的表。不要做
cross join
- 这是一个非常广泛的连接,可用性非常有限。事实上,“cross join”的唯一用法是在教科书的页面上。从来没有在现实生活中。所以就这样做: