仅返回两个表中的重复行

时间:2015-09-16 14:17:04

标签: sql sql-server

到目前为止,我见过的每个主题都是检查重复行并避免它们。我试图让查询只返回重复的行。我认为它会像子查询一样简单,但我错了。然后我尝试了以下内容:

SELECT * FROM a
WHERE  EXISTS
(
     SELECT * FROM b
     WHERE b.id = a.id
)

太破了。如何仅返回重复的行?我目前正在浏览两张桌子,但我担心会有大量的重复。

3 个答案:

答案 0 :(得分:2)

使用此查询,如果您检查相关列,可能会更好。

SELECT * FROM a

INTERSECT 

SELECT * FROM b

答案 1 :(得分:1)

注意:对于重复行的含义,以及您是否正在谈论重复键或所有字段是否相同,存在歧义。我的回答涉及所有领域都是一样的;其他一些人认为它只是关键。目前还不清楚你打算做什么。

您可以尝试

SELECT id, col1, col2 FROM a INNER JOIN b ON a.id = b.id
  WHERE a.col1 = b.col1 AND a.col2 = b.col2

根据需要添加其他列。数据库引擎应该足够智能,以便首先对索引列进行比较,因此只要您不具有仅在许多非索引字段上不同的行,它就会有效。 (如果你这样做,那么我认为任何事情都不会特别有效。)

答案 2 :(得分:0)

我确信您发布的代码与

一样
SELECT * FROM a
WHERE  EXISTS
(
     SELECT 1 FROM b WHERE id = a.id
)

你也可以像INNER JOIN那样做

SELECT a.* FROM a
JOIN b on a.id = b.id;

你也可以使用IN运营商说

SELECT * FROM a where id in (select id from b);

如果没有,那么如果两个表都满足联合限制以及UNION函数,则可以使用ROW_NUMBER()

SELECT * FROM (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY id ORDER BY id) AS rn
FROM (
select * from a

union all 

select * from b) xx ) yy
WHERE rn = 1;