从不同的表中获取虚拟列

Get dummy columns from different tables

我有三个不同的 table 看起来像这样:

Table 1

| id | city|
|----|-----|
| 1  |  A  |
| 1  |  B  |
| 2  |  C  | 

Table 2

| id | city|
|----|-----|
| 2  |  B  |
| 1  |  B  |
| 3  |  C  |

Table 3

| id | city|
|----|-----|
| 1  |  A  |
| 1  |  B  |
| 2  |  A  |

我需要为每个 table 和虚拟值创建一列(如果存在)。

| id | city|  is_tbl_1 |  is_tbl_2   | is_tbl_3   |
|----|-----|-----------|-------------|------------|
| 1  |  A  |    1      |      0      |     1      |
| 1  |  B  |    1      |      1      |     1      |
| 2  |  A  |    0      |      0      |     1      |
| 2  |  C  |    1      |      0      |     0      |
| 2  |  B  |    0      |      1      |     0      |
| 3  |  C  |    0      |      1      |     0      |

我尝试在三个不同的选择上添加列 is_tbl# 自己,UNION 所有三个 tables 和组,但它看起来很难看,有没有更好的方法来做到这一点?

可以将id和city这3个表外联,然后按id和city分组,最后统计city列非空值的个数:

SELECT 
    COALESCE (t1.id, t2.id, t3.id) AS id
    , COALESCE (t1.city, t2.city, t3.city) AS city
    , count(*) FILTER (WHERE t1.city IS NOT NULL) AS is_tbl_1
    , count(*) FILTER (WHERE t2.city IS NOT NULL) AS is_tbl_2
    , count(*) FILTER (WHERE t3.city IS NOT NULL) AS is_tbl_3
FROM
    t1 AS t1
FULL OUTER JOIN 
    t2 AS t2 ON t1.id = t2.id AND t1.city = t2.city
FULL OUTER JOIN 
    t3 AS t3 ON t1.id = t3.id AND t1.city = t3.city
GROUP BY 
    1,2
ORDER BY 
    1,2