【问题标题】:PostgreSQL: One condition for multiple tablesPostgreSQL:多个表的一个条件
【发布时间】:2014-05-14 05:17:31
【问题描述】:

我需要通过检查多个表的单个条件来从表中检索数据。这是一个示例,如下所示:

create table tb1 (
    slno int,
    name text,
    address text
);

create table tb2 (
    slno int,
    fname text,
    faddress text
);

create table tb3 (
    slno int,
    mname text,
    maddress text
);

create table tb4 (
    slno int,
    lname text,
    laddress text
);

insert into tb1 values(1,'aaa','bbb');
insert into tb1 values(2,'2aaa','2bbb');
insert into tb1 values(3,'3aaa','3bbb');
insert into tb1 values(4,'4aaa','4bbb');
insert into tb1 values(5,'5aaa','5bbb');

insert into tb2 values(1,'faaa','fbbb');
insert into tb2 values(2,'f2aaa','f2bbb');
insert into tb2 values(3,'f3aaa','f3bbb');
insert into tb2 values(4,'f4aaa','f4bbb');
insert into tb2 values(5,'f5aaa','f5bbb');

insert into tb3 values(1,'maaa','mbbb');
insert into tb3 values(2,'m2aaa','m2bbb');
insert into tb3 values(3,'m3aaa','m3bbb');
insert into tb3 values(4,'m4aaa','m4bbb');
insert into tb3 values(5,'m5aaa','m5bbb');

insert into tb4 values(1,'laaa','lbbb');
insert into tb4 values(2,'l2aaa','l2bbb');
insert into tb4 values(3,'l3aaa','l3bbb');
insert into tb4 values(4,'l4aaa','l4bbb');
insert into tb4 values(5,'l5aaa','l5bbb');

查询:

select distinct t2.slno 
from 
    tb1,
    tb2 as t2, 
    tb3 as t3, 
    tb4 as t4
where 
    tb1.slno = t2.slno or
    t2.slno = t3.slno or
    t3.slno = t4.slno;

注意:上述查询使我的任务完成,但对于大量数据的执行花费了更多时间。

问题: 1.如何降低时间复杂度?
2. 还有比这个更好的方法吗?

【问题讨论】:

  • 也许 PostgreSQL 分区可能有用?我最近阅读了以下关于分区的讨论,发现它非常有启发性。 github.com/fiksu/partitioned/blob/master/…
  • 你为什么要创建这些编号的表格?这样做的目的/目的是什么?
  • 这些表上没有任何索引。至少您应该在连接列上创建索引。请停止在 where 子句中使用旧的、过时的隐式连接,并开始使用显式 JOIN
  • @a_horse_with_no_name,谢谢。
  • use-the-index-luke.com 是对索引的极好介绍。

标签: performance postgresql join cross-join


【解决方案1】:

join前加一个distinct可以大大降低成本

select distinct t2.slno
from
    (select distinct slno from tb1) t1
    cross join
    (select distinct slno from tb2) t2
    cross join
    (select distinct slno from tb3) t3
    cross join
    (select distinct slno from tb4) t4
where
    t1.slno = t2.slno or
    t2.slno = t3.slno or
    t3.slno = t4.slno

http://sqlfiddle.com/#!15/184dd/3

但如果你解释为什么你有四个相同的表,你会得到更好的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 2023-04-10
    • 2014-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多