我有两张桌子。
表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);
答案 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 )
/
答案 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',你完成了工作。