合并或联接查询,无重复

时间:2019-10-25 10:05:36

标签: sql postgresql

我尝试编写查询以选择两个表中的对象。在第一个中有一个ID列表,在第二个中有此ID以及一个具有特定值的字段。我想显示我的所有id和特定值,即使在第一个表中它为空。当然,我不要重复的结果。

我尝试了加入,联合,选择不足,但是我的id字段总是重复。在SQL UNION中,默认情况下与众不同,因此可以解决问题,但是我不知道如何在不重复id的情况下合并这两个查询。

我制作了一个更加直观的图表:diagram

某些代码,id重复:

SELECT a.id, 'null' AS value
FROM tableA a
UNION
SELECT b.id, b.value
FROM tableB b;

使用条件进行编辑:

SELECT a.id, 'null' AS value
FROM tableA a
UNION
SELECT b.id, b.value
FROM tableB b
WHERE b.idtype = 1;

4 个答案:

答案 0 :(得分:1)

我认为您正在寻找left join

select 
    ta.id,
    tb.value, 
    case when tb.id is null then 'Table A' else 'Table B' end source
from tablea ta
left join tableb tb on ta.id = tb.id

答案 1 :(得分:1)

您可以使用union all

select id, value, 'TableB' as source
from b
union all
select id, NULL, 'TableA'
from a
where not exists (select 1 from b where b.id = a.id);

或者,您可以使用full join

select id, b.value,
       (case when b.id is not null then 'TableB' else 'TableA'
        end) as source
from a full join
     b
     using (id);

答案 2 :(得分:0)

GROUP BY方法可在将来处理分组数据:

select
    coalesce(a.id,b.id) uid,
    *
from b
FULL JOIN a
    ON a.id = b.id
GROUP BY uid;

Coalesce将使用第一个非空值,这样您将拥有所需的所有ID

答案 3 :(得分:0)

这是很常见的情况。这是代码:

SELECT  id      = A.id,
        value   = B.value, 
        source  = 
            CASE 
            WHEN B.id IS NULL THEN 'TableA'
            WHEN C.id IS NULL THEN 'TableB'
            ELSE 'Both'
            END
FROM    (
            SELECT  id 
            FROM    TableA
            UNION 
            SELECT  id
            FROM    TableB
        ) as A
        LEFT OUTER JOIN TableB as B
            ON A.id = B.id
        LEFT OUTER JOIN TableA as C
            ON A.id = C.id
ORDER BY id

联接的第一部分(UNION语句)建立了我喜欢的“存储桶”,第二部分(TableB)将它们填充到了可以的地方。 我喜欢这种方法的地方在于,它反映了您在概念上想做的事情。

接受的答案的一个问题是,如果一个ID同时存在于TableA和TableB中,则源将始终以TableB的形式返回-没有迹象表明它也存在于TableA中。例如,如果要将记录插入ID为2且ID为“ Yellow”且ID为2的TableB中,则该查询的源将返回“ TableB”作为源。此答案中的查询将返回“两个”。关键是,这个答案更容易调整。