2016-03-02 51 views
0

我有一个client,clientcontactscontactphones表。从postgresql中的3个表中获取行

每个客户端可能有很多联系人,每个联系人可能有多个电话。

一些定义为卖家的客户,这意味着sellerid是FK到clientid

我想在这里我给clientid编写一个查询并返回与手机销售商的联系人(如果存在的话)

例如:

客户

clientid name sellerid 
1   jack 
2   jeff 
3   robin 1 

clientcontacts

contactid clientid name 
1    1  Robert 
2    1  Magen 
3    3  Sara 
4    3  Rebeca 

contactphones

contactphoneid contactid phone 
1     1  00522 
2     1  15541 
3     1  555841 
4     3  120 
5     3  121 
6     3  127 

如果我给的clientid = 3 的出放应在接触&手机客户端ID = 1怎么一回事,因为1是3卖方如下:

Sara 120 
Sara 121 
Sara 127 
Rebeca 

我试过以下内容:

With seller (select sellerid from clients where clientid=INPUT) 
select name,phone 
from clientcontacts 
using seller 
left join contactphones on(clientcontacts.contactid=contactphones.contactid) 
where clientcontacts.clientid=seller.sellerid 

这给:

ERROR: syntax error at or near "using"

我怎么能这样做的查询? 如果可能,没有WITH它是优先考虑的。

如果有人也可以解释什么excaly是我的查询问题,可能是伟大的......我不明白为什么USING不在这里工作。

+1

你试过简单的JOIN吗? – jarlh

+0

是的......不能使它工作......我无法得到所需的结果,因为你不能这样做:clientid =输入和clientid = resellerid –

回答

1

首先做一个内部连接以获得所有与之联系的客户联系人(与该联系人)。然后做一个左外连接到挑选那些clientcontacts'电话号码(如果可用):

select cc.name, cp.phone 
from clientcontacts cc 
join clients c on cc.clientid = c.clientid 
left join contactphones cp on cc.contactid = cp.contactid 

where c.clientid = 3 

执行为:

SQL>create table clients (clientid int, name varchar(10), sellerid int); 
SQL>insert into clients values (1,'jack',null); 
SQL>insert into clients values (2,'jeff',null); 
SQL>insert into clients values (3,'robin',1); 
SQL>create table clientcontacts (contactid int, clientid int, name varchar(10)); 
SQL>insert into clientcontacts values (1,1,'Robert'); 
SQL>insert into clientcontacts values (2,1,'Magen'); 
SQL>insert into clientcontacts values (3,3,'Sara'); 
SQL>insert into clientcontacts values (4,3,'Rebeca'); 
SQL>create table contactphones (contactphoneid int, contactid int, phone 
SQL&varchar(10)); 
SQL>insert into contactphones values (1,1,'00522'); 
SQL>insert into contactphones values (2,1,'15541'); 
SQL>insert into contactphones values (3,1,'555841'); 
SQL>insert into contactphones values (4,3,'120'); 
SQL>insert into contactphones values (5,3,'121'); 
SQL>insert into contactphones values (6,3,'127'); 
SQL>select cc.name, cp.phone 
SQL&from clientcontacts cc 
SQL&join clients c on cc.clientid = c.clientid 
SQL&left join contactphones cp on cc.contactid = cp.contactid 
SQL& 
SQL&where c.clientid = 3; 
name  phone 
========== ========== 
Sara  120 
Sara  121 
Sara  127 
Rebeca  - 

        4 rows found 

不是你问什么?

+0

这是行不通的。这只是给了clientid = 3的联系人。这不是需要.....当输入clientid = 3时,我需要看到clientid = 1的联系人 –