2013-08-23 56 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'在Postgres的數據類型。你的意思是'時間戳'? –

+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仍然會檢查c.date字段,即使沒有任何東西存在,如果你使用'not exists'? – 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

您的模式對我來說看起來很陌生。爲什麼合作伙伴有一個參考呼叫?我會說這應該是這樣的:

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 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' 
    ) 

如果你想保持當前的模式,那麼你的查詢可以採取所有不同的合作伙伴的名稱,然後排除那些誰在給定的時間段電話:

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,那麼我會說不存在就是你想要做的。 –

相關問題