小课堂:如何在表和视图之间进行关联查询
-
PostgREST会根据视图所依赖的表来推断视图与其他表的外键关联关系,视图所依赖的表我们称之为基础表。构建视图时,出现在FROM或者JOIN表达式中的表都会被PostgREST视作基础表。要想让外键在视图中起作用,外键字段必须出现在第一层select表达式中,例如,下面的视图包含三个基础表:
nominations
,films
,competitions
:CREATE VIEW nominations_view AS SELECT films.title as film_title , competitions.name as competition_name , nominations.rank , nominations.film_id as nominations_film_id , films.id as film_id FROM nominations JOIN films ON films.id = nominations.film_id JOIN competitions ON competitions.id = nominations.competition_id;
该视图的顶层Select中包含了
nominations.film_id
,该字段与films
表有外键关联关系,因此该视图可以与films
表之间进行关联查询。同样的,该视图包含了films.id
字段,因此可以直接跟roles表进行关联查询,下面是一个该视图与films、roles、actors
表进行多表关联查询的例子:const { data, error } = await supabase .from('nominations_view') .select(` film_title, films(language), roles(character), actors(last_name,first_name) `) .eq('rank', 2)
注意:
- 不是所有视图都支持直接进行关联查询,对于包含union 的视图,目前不支持关联查询,仍旧需要依赖function 手动建立关联关系。
- 如果一个视图依赖另外的视图,PostgREST会将整个视图链表进行扫描,以确保关联查询能正常执行。需要注意的是,所有的视图都必须是在search path范围内的。