在MySQL中从两个表中检索副本

在MySQL中从两个表中检索副本,mysql,sql,oracle,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 我试过了,但它没有给我返回重复

我有两张桌子

表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);

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

select code, desc from tableB
where code in (select code from tableA)
你能行

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 | |代码| DESC| |------|--------| |1 |马利| |1 |萨姆| |2 |鲍勃| |3 |马拉| |4 |安娜|
下面是演示

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

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

虽然我怀疑您只是想要一个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 )
/

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中的一个关键字,所以我把它放在引号中。

下面是给出预期输出的最有效的SQL:

SELECT B.code, B.des
FROM B INNER JOIN A
ON ( B.code = A.code );
这里发布的大多数SQL都是正确的,并且能够完成任务,但是Manu的SQL也很有效,并且提供了奇怪的O/p(在Oracle11g中进行了测试)

我不知道他为什么在评论中承认“……我的查询只返回1行。”


由于联接是通过“代码”进行的,因此它将用001匹配2行。现在,从B中提取'desc',您就完成了工作。

您需要解释导出结果集的逻辑。为什么
001马利
而不是
005萨那
。换句话说,“复制”的定义是什么?实际上我想从这两个表中检索公共代码。在表A中我有001,表2我有2条001的记录。我希望两个表中的所有001都与desc一起使用。即使desc不同!虽然这将适用于发布的数据集,但我认为它不符合OP的要求(尽管我承认它们仍然有点模糊)。如果查询仅在表A中,则不会返回
001 sam
,而我认为OP仍然希望结果集中同时包含
desc
的两个值。我认为他只需要两个表中的代码。因此,如果
001
只出现在一个表中,那么它就不应该出现在输出中。如果A只有
001 sam
,B只有
001 marley
(即每个表一行),那么我认为OP的要求仍然需要两次点击(
sam,marley
),而您的查询将返回一次(
marley
)。但我再说一遍。这并不明显,因为发布的数据并没有涵盖所有的可能性。是的。。在这种情况下,我的查询将只返回1行。。我不知道OP想要什么谢谢你们。001在表B中重复了两次。我希望它输出这两个,即使描述不同。它有帮助吗?你的问题需要更多的帮助吗?