2017-12-05 4 views
0

테이블이 6 개 있습니다. 모두 수백만, 수백만 줄의 데이터를 보유 할 수 있습니다. 모든 테이블에는 object_id, changer_id, date_created 열이 있습니다.하나의 쿼리에 같은 열을 가진 여러 테이블에 쿼리를 결합하십시오.

나는 테이블

SELECT object_id 
FROM table# 
WHERE changer_id=someId 
AND date_created > dateA 
AND dateCreated < dateB 

또는 동급의 Grails의를 모두에 쿼리를 만들 필요가

table#.createQuery().list{ 
     projections{property('object_id')} 
     eq('changer_id', someId) 
     ge('dateCreated' dateA) 
     le('dateCreated', dateB) 
} 

같은 쿼리가 6 개 모든 테이블에 이루어집니다 다음 결과가 모든 중복은 제거됩니다.

중간에 사용하지 않는 것은 dateB가 항상 존재하지 않을 수 있으므로 생략 될 수 없기 때문입니다.

이 쿼리를 6 개의 테이블을 통해 단일 쿼리로 결합하거나 6 가지 별도의 쿼리보다 빠르게 만드는 다른 방법이 있습니까?

+0

통합 쿼리가이를 수행 할 수 있습니다. https://www.postgresql.org/docs/current/static /queries-union.html - 결국 데이터 소스를 언제든지 직접 할 수 있습니다. – cfrick

+0

@cfrick "항상 데이터 소스 일 수 있습니까?" 나는 몇몇 단어가 빠져 있다고 생각한다. 그리고 노조와 함께, 그것은 여전히 ​​6 개의 다른 질의를 수행 할 것입니다. 결국 6 개의 질의를 수행 할 것입니다. 6 개의 쿼리를 개별적으로 수행하고 조합하는 것보다 더 낳은 것입니까? –

+0

"항상 DS를 주입 할 수 있습니다"; DB가 모든 작업을 수행하고 최소한의 데이터 만 반환하기 때문에 가장 빠를 가능성이 큽니다. 물론 성능은 측정되어야하며화물은 배양되지 않아야합니다. – cfrick

답변

0

SQL 상속 : 한 번 이렇게 :

가정 당신의 테이블

설치 등 table1, table2입니다 필요에 따라

create table combined (like table1); 

alter table table1 inherits combined; 
alter table table2 inherits combined; 
alter table table3 inherits combined; 
alter table table4 inherits combined; 
alter table table5 inherits combined; 
alter table table6 inherits combined; 

쿼리가이 여러 번 수행

SELECT object_id 
FROM combined 
WHERE changer_id=someId 
AND date_created > dateA 
AND dateCreated < dateB 

postgresql은 내부적으로 노동 조합이 필요했다.

결합 된 테이블을 만들 때 일부 테이블에서 누락 된 열을 제외하지 않으면 모든 테이블에 동일한 열이 있다고 가정합니다. (당신은 like ...을 사용할 필요가 없습니다. 더 일반적인 list-of-columns 구문을 사용할 수 있습니다)