2014-05-14 4 views
1

여러 테이블에 대한 단일 조건을 검사하여 테이블에서 데이터를 검색해야합니다. 아래 그림과 같이 다음 샘플 예제입니다PostgreSQL : 여러 테이블에 대한 하나의 조건

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. 더 좋은 방법이 있습니까?

+0

아마도 PostgreSQL 파티션이 유용할까요? 나는 최근에 파티셔닝에 관한 다음 토론을 읽고 매우 계몽 적이라는 것을 알게되었습니다. https://github.com/fiksu/partitioned/blob/master/PARTITIONING_EXPLAINED.txt – hoipolloi

+4

왜이 번호가 매겨진 테이블을 처음부터 만들었습니까? 목표의 목적은 무엇입니까? –

+2

테이블에 인덱스가 없습니다. 적어도 조인 C 럼에 인덱스를 작성해야합니다. 그리고 where 절에서 오래된 구식 암시 적 조인을 사용하지 말고 명시 적'JOIN'을 사용하십시오. –

답변

1

당신은 크게 join

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

전에 distinct를 수행하여 비용을 줄일 수 있습니다하지만 당신은 4 개 개의 동일한 테이블이있는 이유를 설명 할 경우 당신은 더 나은 대답을 할 수 있습니다.

+0

정말 고마워요. – Meem