从postgresql

时间:2016-03-02 08:27:05

标签: sql postgresql

我有clientclientcontactscontactphones表。

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

某些客户定义为卖家,这意味着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 输出应该是联系人& clientid = 1 beacuse 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

这给出了:

  

错误:“使用”

处或附近的语法错误

我该怎么做这个查询? 如果可能,如果没有WITH则优先。

如果有人也可以解释我的查询问题是什么,那可能很棒......我不明白为什么USING在这里不起作用。

1 个答案:

答案 0 :(得分:1)

首先进行内部联接以获取所有具有联系人(具有该clientid)的客户端联系人。然后执行左外连接以选择那些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

这不是你要的吗?