【问题标题】:PostgreSQL Conditional JoinPostgreSQL 条件连接
【发布时间】:2011-09-04 07:57:19
【问题描述】:

假设我有以下表格--

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)

谢谢。

【问题讨论】:

    标签: sql database postgresql stored-procedures join


    【解决方案1】:
    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,但你的更酷。超级!
    猜你喜欢
    • 1970-01-01
    • 2018-12-06
    • 2021-10-27
    • 2017-06-28
    • 2016-09-03
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    相关资源
    最近更新 更多