0

我有两张桌子。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 回答 3

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);
于 2013-03-07T15:26:15.753 回答
2

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

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

coalesce从列表中选择第一个不为 null 的参数

于 2013-03-07T15:23:42.893 回答
1
SELECT [id], [Name]
FROM TableB

UNION

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

UNION将自动排除重复项。您需要更改的只是从TableB第一个选择。

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

于 2013-03-07T15:22:39.043 回答