从MySQL中的两个表中检索重复项

时间:2014-02-02 08:16:41

标签: mysql sql oracle

我有两张桌子。

表A:

code desc
001   sam
002   bob
003   mala
004   anna

表B:

code  desc
001  marley
001  sam
002  bob
003 mala
004 anna
005 sana

我想检索code值常见的两个表中的所有行,而不管desc的值是多少。也就是说,我的最终结果应该是:

001 marley
001 sam 
002 bob 
003 mala
004 anna

我试试这个,但它并没有将001 marley的副本归还给我。

SELECT COUNT(*)
  FROM TABLEA
  WHERE NOT EXISTS(SELECT * FROM TABLEB);

6 个答案:

答案 0 :(得分:2)

你可以做到

SELECT a.code, a.desc
  FROM tablea a JOIN tableb b
    ON a.code = b.code
UNION 
SELECT b.code, b.desc
  FROM tablea a JOIN tableb b
    ON a.code = b.code
 ORDER BY code, `desc`

输出:

| CODE |   DESC |
|------|--------|
|    1 | marley |
|    1 |    sam |
|    2 |    bob |
|    3 |   mala |
|    4 |   anna |

这是 SQLFiddle 演示

答案 1 :(得分:0)

我不确定我是否理解你的问题,因为marley只在表2中,所以它不是重复的。 但是,如果使用

,则可以获得所需的结果集
select code, desc from tableB
where code in (select code from tableA)

答案 2 :(得分:0)

尝试这个简单的查询。它将解决您的问题&它也是最有效的解决方案。

SELECT tableB.*
FROM
tableB
INNER JOIN
tableA
ON ( tableB.code = tableA.code );

答案 3 :(得分:0)

虽然我怀疑你只想要一个MySQL选项,但这里是Oracle RDBMS解决方案。它使用了几个简洁的功能:INTERSECT运算符产生一组公共值,而WITH子句用于提高子查询的性能。它还使用UNION运算符来生成一组所有不同的值。

with cc as ( select code from a
             intersect 
             select code from b )
select * from a
where code in ( select code from cc )
union 
select * from b
where code in ( select code from cc )
/

Here is Teh Obliquitory Fiddle!

答案 4 :(得分:0)

Peterm的解决方案有效,但它在创建和删除重复项方面做了不必要的工作。在两个数据库中都有效的解决方案是:

select a.code, a."desc"
from tablea a
where exists (select 1 from tableb b where a.code = b.code)
union all
select b.code, b."desc"
from tableb b
where exists (select 1 from tablea b where a.code = b.code);

使用tablea(code)tableb(code)上的索引,这些查询会更有效。您也可以为每个索引添加desc

因为desc是SQL中的关键字,所以我把它放在引号中。

答案 5 :(得分:0)

这是提供预期输出的最有效的SQL:

SELECT B.code, B.des
FROM B INNER JOIN A
ON ( B.code = A.code );

这里发布的大多数SQL都是正确的并且正在完成工作,但Manu的SQL也很有效,并且也提供了奇怪的O / P(在Oracle 11G 中测试过)。

我不确定为什么他在评论中承认' ..我的查询只返回1行。'

由于连接是'代码',它将匹配2行和001.现在,从B中拉出'desc',你完成了工作。