重写联合查询

时间:2013-06-21 19:50:56

标签: sql oracle oracle11g

我有两个具有相同结构的表,比方说TA和TB。 TA和TB中的大多数记录都是相同的。 TA中有一些记录不是结核病,而一些结核病患者不是TA。我只想得到TA和TB的所有记录,而不是两面性:

Select * from TA
Union
Select * from TB

这个查询确实给了我想要的结果。但是在生产方面表现并不好,两个表中的数据都超过50万。是否有一种简单的方法可以从两个表中获取所有记录?两个表都有一个id列,它具有唯一的值,可以通过它连接。

4 个答案:

答案 0 :(得分:2)

您可以使用NOT EXISTS + UNION ALL

Select * from TA
UNION ALL
Select * from TB where not exists (select * from TA where TA.KEY_ID = TB.KEY_ID)

这可以获取TA中的所有数据和TB中的非重复数据。

答案 1 :(得分:2)

尝试:

SELECT COALESCE(A.ID,B.ID), COALESCE(A.field2,B.field2), etc.
FROM A
FULL JOIN B
 ON A.Id = B.ID

答案 2 :(得分:0)

使速度更快的唯一方法是使用UNION ALL,正如您所说的有重复,这是有问题的。

UNION非常高效,优化且简单。不幸的是,没有更好的方法了。

答案 3 :(得分:0)

排除重复项时,

UNION相当慢。 如果您在这些表上有密钥,请尝试在第2个表中添加WHERE子句以排除重复项。 你会比db更加智能。