PostgreSQL条件连接

9

假设我有以下表格--

smallville=# create table contacts (name varchar(16), address_id int); 
CREATE TABLE
smallville=# create table addresses (address_id int, address varchar(16));
CREATE TABLE
smallville=# create table partners (name1 varchar(16), name2 varchar(16));
CREATE TABLE

smallville=# insert into contacts values ('Clark Kent', NULL), ('Loise Lane', 1);
INSERT 0 2
smallville=# insert into addresses values (1, 'Manhattan'), (2, 'North Pole');
INSERT 0 2
smallville=# insert into partners values ('Clark Kent', 'Loise Lane'),
             ('Loise Lane', 'Clark Kent') ; 
INSERT 0 2

我可以获取姓名和地址--
smallville=# select c.name, a.address from contacts c
             left outer join addresses a
             on c.address_id = a.address_id ; 
    name    |  address  
------------+-----------
 Clark Kent | (NULL)
 Loise Lane | Manhattan
(2 rows)

但是如果一个人的地址缺失,我该如何获取他/她的配偶地址呢?

    name    |  address  
------------+-----------
 Clark Kent | Manhattan
 Loise Lane | Manhattan
(2 rows)

感谢您的选择。
1个回答

16
select c.name, coalesce(a.address, a1. address) from contacts c
left outer join addresses a on c.address_id = a.address_id 
left outer join partners on c.name=partners.name1 
left outer join contacts c1 on c1.name=partners.name2 
left outer join addresses a1 on c1.address_id = a1.address_id;

谢谢,我本来要在这里评论说我会使用UNION ALL来粘合NULL和非NULL contacts.address,但是你的方法更酷。超赞! - Jerry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接