SQL检查INNER / LEFT join不重复行的方法

时间:2011-09-27 18:11:10

标签: sql postgresql

是否有一个好的或标准的SQL方法断言连接不会复制任何行(生成源表行的0或1个副本)?断言导致查询失败或以其他方式指示存在重复行。

许多查询中的一个常见问题是,当一个表与另一个表预期为1:1时,可能存在2个与连接条件匹配的行。这可能导致难以追踪的错误,特别是对于不一定完全熟悉表格的人。

似乎应该有一些简单而优雅的 - 这对于SQL引擎来说很容易检测(我已将这个源行加到另一个表中的一行了吗?好吧,错误)但我似乎无法找到任何东西。我知道这个问题存在长期/侵入性的解决方案,但对于许多即席查询来说,解决这些问题并不是很有趣。

编辑/澄清:我正在寻找一步一步的查询级修复。不是对该查询结果的验证步骤。

3 个答案:

答案 0 :(得分:2)

如果您只是测试链接行而不是需要输出,那么您将使用EXISTS。

更准确地说,您需要“半连接”,但大多数RDBMS都不支持此操作,除非作为EXISTS

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

另见:

答案 1 :(得分:1)

SELECT JoinField
FROM MyJoinTable
GROUP BY JoinField
HAVING COUNT(*) > 1
LIMIT 1

这很简单吗?没有Postgres,但我认为这是有效的语法。

答案 2 :(得分:1)

的内容
SELECT a.id, COUNT(b.id)
FROM TableA a
JOIN TableB b ON a.id = b.id
GROUP BY a.id
HAVING COUNT(b.id) > 1

应返回TableS中具有表中多个关联行的行。