我有一个这样的表(基本示例,不是真实的东西):

FKEY  | NAME  | ATTRIBUTE_X
--------------------------
 1      '...'    42
 1      '...'    42
 1      '...'    42
 2      '...'    7
 2      '...'    7
 5      '...'    42
 5      '...'    42
 5      '...'    42
 5      '...'    42
 6      '...'    300
 6      '...'    300
 ....

其中-通常-给定fkey的每个attribute_x值都相同。 (在我的实际数据中,我从表中的某些列计算出attribute_x,并且对于具有相同fkey的所有行,此属性都必须相同。

现在,我有一些该属性不成立的行。我想搜索整个表以查找所有不匹配attribute_x值的FKEY。

例:
--------------------------
 145678973      '...'    23
 145678973      '...'    22 // Error, should also be 23
 145678973      '...'    23

我的幼稚方法是:
SELECT distinct(TX1.FKEY)
FROM TABLEX TX1, TABLEX TX2
WHERE TX1.FKEY=TX2.FKEY
  AND TX1.ATTRIBUTE_X <> TX2.ATTRIBUTE_X
;

但是用我的真实数据并不能完成(我用完了临时表空间,并且在DBA将临时表空间增加到20 GIG之后,查询运行了几个小时,然后保释了。)

通常,对此有更有效的查询吗?

我有一个使用PL / SQL的解决方案,我只遍历按FKEY排序的表,如果我发现另一个attribute_x与上一个fkey保持不变的上次获取记录不同,我发现了一个错误的fkey。

但这似乎很原始:-)是否有一个有效的纯SQL解决方案?

最佳答案

最简单的方法:

select fkey
from tablex
group by fkey
having count(distinct attribute_x) > 1

关于sql - 查找值不匹配的行集而没有较大的自连接?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8259810/

10-12 07:12