到目前为止,我见过的每个主题都是检查重复行并避免它们。我试图让查询只返回重复的行。我认为它会像子查询一样简单,但我错了。然后我尝试了以下内容:
SELECT * FROM a
WHERE EXISTS
(
SELECT * FROM b
WHERE b.id = a.id
)
太破了。如何仅返回重复的行?我目前正在浏览两张桌子,但我担心会有大量的重复。
答案 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;