我有一个这样的表(基本示例,不是真实的):
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。 / p>
但这看起来很原始:-)是否有一个高效的纯SQL解决方案?
答案 0 :(得分:9)
最简单的方法:
select fkey
from tablex
group by fkey
having count(distinct attribute_x) > 1
答案 1 :(得分:4)
这应该这样做
select
FKEY
from
(
select distinct
FKEY,
ATTRIBUTE_X
from
MYTABLE
)
group by
FKEY
having
count(*) > 1
答案 2 :(得分:4)
以下内容也应该有效:
SELECT fkey FROM mytable GROUP BY fkey HAVING MIN(attribute_x) <> MAX(attribute_x)
答案 3 :(得分:2)
试试这个
select count(*),FKEY from (Select distinct FKEY,ATTRIBUTE_X from TABLEX)
having count(*)>1
编辑我更正了查询有2而不是1
答案 4 :(得分:1)
试试这个
SELECT * FROM tablex
WHERE (fkey, name, attribute_x) NOT IN
(SELECT fkey, name, attribute_x FROM tablex
GROUP BY fkey)
或(如果不考虑姓名)
SELECT * FROM tablex
WHERE (fkey, attribute_x) NOT IN
(SELECT fkey, attribute_x FROM tablex
GROUP BY fkey)