我尝试编写查询以选择两个表中的对象。在第一个中有一个ID列表,在第二个中有此ID以及一个具有特定值的字段。我想显示我的所有id和特定值,即使在第一个表中它为空。当然,我不要重复的结果。
我尝试了加入,联合,选择不足,但是我的id字段总是重复。在SQL UNION
中,默认情况下与众不同,因此可以解决问题,但是我不知道如何在不重复id的情况下合并这两个查询。
某些代码,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;
答案 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”作为源。此答案中的查询将返回“两个”。关键是,这个答案更容易调整。