如何从表中选择不同列中三个或更多值相同的行?

时间:2012-02-27 16:52:44

标签: sql oracle join

您好我整个上午一直在努力。我认为这是一个简单的自连接,但是自连接实际上返回了太多行。

基本上我正在尝试在表中找到行,其中某些列值在行与行之间匹配。

因此,如果第一行和第三行在三个特定列中具有相同的列值,则返回这两行。

到目前为止,我已经尝试了一种自我加入,并以几种不同的方式进行半连接。

SELECT * 
FROM ATable a, ATable b
Where  a.colValue = b.colValue
and    a.colValue2 = b.colValue2

这会返回太多行。 这个查询甚至是连接吗?我在这里走错了路吗? 关于self连接我错过了什么,它返回的行多于表本身?

ATable包含20行,但上面的查询返回36。

始终非常感谢任何答案或提示。我只是通过提出问题来学习。

3 个答案:

答案 0 :(得分:2)

此刻的查询将返回每一行,因为所有行都等于它们自己。 您需要限制它,以便它们必须是不同的行。

我假设你有某种主键ID列。

SELECT * 
FROM ATable a, ATable b
Where  a.colValue = b.colValue
and    a.colValue2 = b.colValue2
and    a.Id!= b.Id

你需要考虑的另一件事是,如果你有行:

ID      ColValue     ColValue2   ColValue3
1           A            B            C
2           A            B            D

您会看到:

a.id a.ColValue a.ColValue2 a.ColValue3 b.id b.ColValue b.ColValue2 b.ColValue3
1    A          B           C           2    A          B           D
2    A          B           D           1    A          B           C

因为第1行与第2行相同。但第2行与第1行相同。

答案 1 :(得分:1)

你做对了...对于每一行,你将获得自己,以及与你指定的列匹配的所有其他行,它应该是表中总行数的最小值,可能更多。

答案 2 :(得分:0)

您是否尝试查找重复的行?

SELECT count(a.id) as cnt
FROM ATable a
GROUP BY a.colValue
WHERE cnt>1