2016-04-25 24 views
0

将PostgreSQL 9.5.1版中的两个表连接起来使用UNION;并用布尔值检查列name中的值是否出现在这些表中的一个或两个中。使用union将两个表连接起来

这是我最小的示例代码:

WITH things_a(name) AS (
      VALUES ('AAA'),('BBB'),('CCC')), 
    things_b(name) AS (
      VALUES ('BBB'),('CCC'),('DDD')) 
SELECT * 
FROM 
    (SELECT name AS name, 
     TRUE AS in_a, 
      NULL::boolean AS in_b 
    FROM things_a 
    UNION SELECT name AS name, 
     NULL AS in_a, 
     TRUE AS in_b 
    FROM things_b) AS things 
ORDER BY name 

对于我想有以下结果:

name | in_a | in_b 
------------------------ 
AAA | t  | f 
BBB | t  | t 
CCC | t  | t 
DDD | f  | t 

但也有可能是当然的替代方法

+0

你尝试过什么,到目前为止,你得到什么样的结果是从目标不同? – jmelesky

回答

0

待办事项你真的想用UNION

你可以简单地使用:

WITH things_a(name) AS (
      VALUES ('AAA'),('BBB'),('CCC')), 
    things_b(name) AS (
      VALUES ('BBB'),('CCC'),('DDD')) 
SELECT COALESCE(things_a.name,things_b.name) as name, 
     things_a.name is not null as in_a, 
     things_b.name is not null as in_b 
from things_a full outer join things_b 
    on things_a.name=things_b.name 
order by 1 
; 

或者是你的隐含的问题,要求的示例代码中缺少的部分?

那么下面可能是你在找什么:

WITH things_a(name) AS (
      VALUES ('AAA'),('BBB'),('CCC')), 
    things_b(name) AS (
      VALUES ('BBB'),('CCC'),('DDD')) 
SELECT name, COALESCE(bool_or(in_a),false) as in_a, coalesce(bool_or(in_b),false) in_b 
FROM 
    (SELECT name AS name, 
     TRUE AS in_a, 
      NULL::boolean AS in_b 
    FROM things_a 
    UNION SELECT name AS name, 
     NULL AS in_a, 
     TRUE AS in_b 
    FROM things_b) AS things 
group by name 
ORDER BY name;