您好我整个上午一直在努力。我认为这是一个简单的自连接,但是自连接实际上返回了太多行。
基本上我正在尝试在表中找到行,其中某些列值在行与行之间匹配。
因此,如果第一行和第三行在三个特定列中具有相同的列值,则返回这两行。
到目前为止,我已经尝试了一种自我加入,并以几种不同的方式进行半连接。
SELECT *
FROM ATable a, ATable b
Where a.colValue = b.colValue
and a.colValue2 = b.colValue2
这会返回太多行。 这个查询甚至是连接吗?我在这里走错了路吗? 关于self连接我错过了什么,它返回的行多于表本身?
ATable包含20行,但上面的查询返回36。
始终非常感谢任何答案或提示。我只是通过提出问题来学习。
答案 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