2016-04-25 7 views
0

PostgreSQLバージョン9.5.1の2つのテーブルをUNIONで連結します。これらのテーブルの一方または両方にブール値で列nameの値が表示されているかどうかを確認します。ここでユニオンで2つのテーブルを連結する

は私の最小限のコード例である:私は次のような結果がしたい

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; 
関連する問題