2013-08-23 3 views
-1

PostgreSQL에서 일정 시간 간격으로 다른 테이블의 빈 행과 관련된 테이블 행 하나를 표시하는 방식으로 행을 필터링 할 수 있습니까?PostgreSQL - 관련 조건이없는 경우 결과 선택

두 테이블 partnerscalls있다 : 즉

이 예제를 상상한다.

create table partners(
    id int, 
    name varchar(100), 
    call_id references calls (id), 
    PRIMARY KEY (id) 
); 

create table calls(
    id int, 
    name varchar(100), 
    date timestamp, 
    PRIMARY KEY (id), 
); 

지금 상상해보십시오. 파트너 테이블에서 생성 된 일부 행이 있습니다. 일부 통화가 작성되고 행이 통화에 표시됩니다 (전화를 걸 때 날짜가 등록 된 경우). 하지만 그 반대의 것을 걸러 내야합니다. 전화가없는 파트너를 보는 방법으로 2013-05-01에서 2013-06-01 사이의 날짜를 말합니까?

기간이 필요하지 않으면 존재하지 않는 레코드가있는 파트너를 필터링하는 방법이 있습니다. (기간이 필요하지 않으면 쉽습니다. 통화가없는 파트너 만 필터링 할 수 있습니까?) 외부 시간 등을 사용해야합니까?

+1

포스트 그레스에서'datetime'라는 데이터 타입이 없습니다. '타임 스탬프'를 말하는거야? –

+0

@ErwinBrandstetter 죄송합니다. 지금 타임 스탬프로 변경되었습니다. openerp에서 사용 된 datetime은 postgres가 다른 이름을 가지고 있다는 것을 잊었습니다. – Andrius

답변

2

뭔가 :

select p.* 
from partners p 
where not exists (select 1 
        from calls c 
        where c.name = p.name 
        and c.date between DATE '2013-05-01' and DATE '2013-06-01'); 
+0

그래서 PostgreSQL은'not exists'를 사용하면 아무것도 없더라도 c.date 필드를 계속 확인합니까? – Andrius

+0

@Andrius : 물론 그렇습니다 (모든 DBMS가 그렇게 할 것입니다). –

0

매우 비밀스러운 데이터 구조입니다. partners이라는 테이블에는 파트너 당 하나의 행이 있어야합니다. 당신이 파트너라고 부르는 것은 실제로 다른 테이블이어야합니다.

그래서 할 일은 파트너 목록을 얻는 것입니다. 그런 다음 left outer join을 사용하여 다른 테이블에 연결하십시오. 일치하는 항목이 없으면 행을 유지하십시오.

select p.* 
from (select distinct name 
     from partners 
    ) as allpartners left outer join 
    p 
    on p.name = allpartners.name left outer join 
    calls c 
    on p.call_id = c.id and 
     c.date between DATE1 and DATE2 
where c.name is NULL; 
1

스키마가 저에게 이상합니다. 왜 파트너가 전화를 걸었습니까?

select p.* 
from partners as p 
where 
    not exists 
    (
     select * 
     from calls as c 
     where c.partner_id = p.id and c.date between '2013-05-01' and '2013-06-01' 
    ) 

당신이 당신의 현재 스키마를 유지하려면

은, 다음 쿼리는 모든 별개의 파트너 이름을 가지고 있었던 것처럼

create table partners(
    id int, 
    name varchar(100), 
    PRIMARY KEY (id) 
); 

create table calls(
    id int, 
    date datetime, 
    partner_id references partners (id), 
    PRIMARY KEY (id), 
); 

및 쿼리가 될 것이다 : 나는 다음과 같이해야한다라고 말하고 싶지만 시간의 주어진 기간에 통화가 사람들을 제외 :

select distinct p.name 
from partners as p 
except 
select distinct p.name 
from partners as p 
    inner join calls as c on c.id = p.call_id 
where c.date between '2013-05-01' and '2013-06-01' 

이 파트너와 전화 사이에 링크가 없습니다, 당신은 단지 통화 테이블에서 이름을 제외 할 경우 (나는 말했다, 스키마 정말 이상하다 :) 같은

select distinct p.name 
from partners as p 
except 
select distinct c.name 
from calls as c 
where c.date between '2013-05-01' and '2013-06-01' 
+0

실제로 스키마는 실제로 관련이 없습니다. 다른 테이블과 관련된 하나의 테이블을 필터하는 방법과 일부 시간 간격에 존재하지 않는 다른 테이블 행을 필터링하는 방법을 알아야했습니다. – Andrius

+0

@Andrius, 그렇다면 내가 원하는 것은 존재하지 않는다고 말하고 싶습니다. –

관련 문제