SQL查询 - 从2个表中选择不常见的值

时间:2014-04-26 12:18:24

标签: sql duplicates

今天我在面试中被问到以下问题,因为查询不正确,我没有被选中。从那时起,我的想法是渴望得到以下场景的正确答案:

我得到了以下2个表:

Tabel A  |       |Table B
---------        ----------
**ID**          **ID**          
--------        -----------
0  |            | 5 |
1  |            | 6 |
2  |            | 7 |
3  |            | 8 |
4  |            | 9 |
5  |            | 10|
6  |            -----
----

预计使用SQL查询后输出:

**ID**
--------
| 0  |
| 1  |
| 2  |
| 3  |
| 4  |
| 7  |
| 8  |
| 9  |
| 10 |
--------

谢谢大家,我真的很喜欢这个论坛,从现在开始,我们将在这里积极学习更多关于SQL的知识。我想把它作为我的强点,而不是弱点,以免被踢出其他采访。我知道还有很长的路要走。然而,除了您的所有回复之外,我还是起草了以下查询,并希望从这里的专家那里了解他们对我的查询的看法(以及他们考虑他们的想法的原因):

BTW查询已经在MSSQLSRV-2008上工作(使用Union或Union All,与我得到的结果无关):

从A中选择ID,其中ID不在(5,6)

联合

从B中选择ID,其中ID不在(5,6)

这真的是一个有效的查询吗?

3 个答案:

答案 0 :(得分:3)

如果您只想在两个表中的一个表中使用值,我会使用full outer join和条件:

select coalesce(a.id, b.id)
from tableA a full outer join
     tableB b
     on a.id = b.id
where a.id is null or b.id is null;

当然,如果在使用MS Access或MySQL的公司工作,那么这不是正确的答案,因为这些系统不支持full outer join。您也可以使用union all和聚合甚至其他方法以更复杂的方式执行此操作。

编辑:

这是另一种方法:

select id
from (select a.id, 1 as isa, 0 as isb from tablea union all
      select b.id, 0, 1 from tableb
     ) ab
group by id
having sum(isa) = 0 or sum(isb) = 0;

另一个:

select id
from tablea
where a.id not in (select id from tableb)
union all
select id
from tableb
where b.id not in (select id from tablea);

正如我想到的那样,这是一个非常好的面试问题(即使我已经给出了三个合理的答案)。

答案 1 :(得分:0)

编辑:请参阅上面的Gordon回答以获得更好的请求,这是非常有效的方式来做你想做的事。

我认为这应该可以解决问题:

(SELECT * FROM A WHERE NOT id IN (SELECT A.id FROM A, B WHERE A.id = B.id))
UNION
(SELECT * FROM B WHERE NOT id IN (SELECT A.id FROM A, B WHERE A.id = B.id))

您可以使用临时表来避免重复SELECT A.id ...

答案 2 :(得分:0)

没有完整的外连接...

Select id
from (Select id from tableA
      Union all
      Select id from tableB) Z
group by id
Having count(*) = 1

或使用Except and Intersect .....

(Select id from tableA Except Select id from tableB)
Union
(Select id from tableB Except Select id from tableA)

或......

(Select id from tableA union Select id from tableB)
Except
(Select id from tableA intersect Select id from tableB)