我有一个包含很多外键的表,我需要内连接才能搜索。可能有超过10个,这意味着我必须做10个内连接。与我加入的大量(数百万行)表相比,每个连接的表可能只有几行。
我只需要知道连接是否是一种快速方式(仅使用Postgres)来执行此操作,或者如果可能有更聪明的方法,我可以使用子查询或其他方式来执行此操作。
以下是一些组成数据的例子:
create table a (
a_id serial primary key,
name character varying(32)
);
create table b (
b_id serial primary key,
name character varying(32)
);
--just 2 tables for simplicity, but i really need like 10 or more
create table big_table (
big_id serial primary key,
a_id int references a(a_id),
b_id int references b(b_id)
);
--filter big_table based on the name column of a and b
--big_table only contains fks to a and b, so in this example im using
--left joins so i can compare by the name column
select big_id,a.name,b.name from big_table
left join a using (a_id)
left join b using (b_id)
where (? is null or a.name=?) and (? is null or b.name=?);
答案 0 :(得分:2)
基本上,连接是一种快速的方式。哪种方式可能最快取决于具体要求。一些提示:
您的WHERE
条款的目的尚不清楚。您似乎打算加入所有查找表并为每个查找表包含一个条件,而您实际上只需要其中的一些。那效率很低。而是使用dynamic-sql并仅在查询中包含您实际需要的内容。
使用当前查询,由于主表中的所有fk列都可以是NULL
,因此必须使用LEFT JOIN
而不是JOIN
或者您将在fk列中排除NULL
个值的行。
查找表中的name
列当然应该定义为NOT NULL
。我不会使用非描述性列名"name"
,这是一个无用的命名约定。 I also would use text
instead of varchar(32)
.