执行两个表oracle的UNION?

时间:2013-03-07 15:19:38

标签: sql oracle

我有两张桌子。 TableATableB。这两个表都有一些包含两列的数据,如下所示。

TableA
---------
id  Name
--- ----
1   abc
2   def

TableB
---------
id  Name
--- ----
1   xyz
2   pqr

查询:

select id, name 
from TableA 
union
select id, name 
from TableB;

要求是:我需要满足标准以下的查询。

  1. 如果TableA具有TableB中不存在的数据,则必须返回TableA数据
  2. 如果TableB具有TableA中不存在的数据,则必须返回TableB数据
  3. 如果在具有相同id的两个表中找到记录,则必须重新报告TableB数据
  4. 我该如何编写查询?

3 个答案:

答案 0 :(得分:2)

您可以使用外部联接而不是联合来执行此操作:

select coalesce(TableA.id, TableB.id),
       coalesce(TableB.name, TableA.name)
    from TableA 
    full outer join TableB on
       TableA.id = TableB.id;

coalesce selects the first argument from the list that is not null

答案 1 :(得分:2)

您的查询不满足(3)。

假设id不可为空,您可以写:

SELECT id, name
  FROM tableB
 UNION ALL
SELECT id, name
  FROM tableA a
 WHERE a.id NOT IN (SELECT b.id
                      FROM tableB);

答案 2 :(得分:1)

SELECT [id], [Name]
FROM TableB

UNION

SELECT [id], [Name]
FROM TableA
WHERE [id] NOT IN (SELECT [id] FROM [TableB]

UNION会自动排除重复项。您需要更改的是首先从TableB中选择。

编辑:对不起,我想我没有完全阅读你的问题。我根据以下评论编辑了我的答案。