按键的PostgreSQL UNION

mspsb9vt  于 2023-01-25  发布在  PostgreSQL
关注(0)|答案(4)|浏览(109)

不能拿出简单的解决方案如何联合表相同的列,但从第二个表只添加行,这是目前在第一个表。
第1次:
| 身份证|A类|乙|C级|
| - ------|- ------|- ------|- ------|
| 1个|xx|r|克|
| 第二章|立方厘米|r|克|
| 五个|日|克|电子|
t2:
| 身份证|A类|乙|C级|
| - ------|- ------|- ------|- ------|
| 一百零一|吉吉|乌|j|
| 五个|Y型|吉库|乌|
| 十二|Y型|r|j|
期望的t1联合t2:
| 身份证|A类|乙|C级|
| - ------|- ------|- ------|- ------|
| 1个|xx|r|克|
| 第二章|立方厘米|r|克|
| 五个|日|克|电子|
| 五个|Y型|吉库|乌|
感谢你的帮助。

ux6nzvsh

ux6nzvsh1#

我们可以使用一个IN子句,并且假设表2的id必须出现在表1中:

SELECT id, A, B, C
FROM t1
UNION ALL
SELECT id, A, B, C
FROM t2
WHERE t2.id IN (SELECT id FROM t1);

试用:db<>fiddle

fnvucqvd

fnvucqvd2#

比如:

SELECT id, a, b, c
from t1
union all
SELECT id, a, b, c
from t2
where exists (select *
              from t1
              where t1.id = t2.id);
of1yzvn4

of1yzvn43#

我们可以在窗口函数的帮助下尝试下面的联合方法:

WITH cte AS (
    SELECT id, A, B, C, 1 AS src FROM t1
    UNION ALL
    SELECT id, A, B, C, 2 FROM t2
),
cte2 AS (
    SELECT *, MIN(src) OVER (PARTITION BY id) AS min_src,
              MAX(src) OVER (PARTITION BY id) AS max_src
    FROM cte
)

SELECT id, A, B, C
FROM cte2
WHERE src = 1 OR min_src <> max_src
ORDER BY id, src;
fykwrbwg

fykwrbwg4#

大概是这样的

SELECT t1.id, t1.A, t1.B, t1.C
FROM t1
FULL OUTER JOIN t2 ON t1.id = t2.id
WHERE t1.id IS NOT NULL

相关问题