2016-04-25 4 views
0

Объединить две таблицы в PostgreSQL версии 9.5.1 с помощью UNION; и проверьте, отображается ли значение в столбце name в одной или обеих этих таблицах с булевым.Соединить две таблицы с объединением

Вот мой минимальный пример кода:

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

Do вы действительно хотите использовать 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;