2011-11-24 48 views
2

我有這樣一個表(基本的例子,不是真實的東西):查找具有不匹配的值而沒有大的自連接的行集?

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的行都必須相同。

現在我有一些行,此屬性不適用。搜索整個表找到所有FKEYs不匹配attribute_x值

例:

-------------------------- 
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解決方案?

回答

9

最簡單的方法:

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

我接受此答案而不是[Helena's](http://stackoverflow.com/q/8260067/321013),因爲此版本也適用於非數字'attribute_x'。 –

+0

注意:這個版本和MAX <> MIN版本的實際數據的自動跟蹤成本完全相同:'17518' :-) –

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) 
+0

這會不會返回整個表?加上它不會被認爲是一個自我加入(雖然半自我加入:)? –

+0

@VincentMalgrat:不,我的查詢(我測試過)只返回每個fkey具有不同屬性的記錄。 – Marco

+1

@MarkBannister:不,我的查詢(我測試了它)返回記錄,其中每個fkey都有與第一個不同的attribute_x列:) – Marco

4

這應該這樣做

select 
    FKEY 
from 
    (
    select distinct 
    FKEY, 
    ATTRIBUTE_X 
    from 
    MYTABLE 
) 
group by 
    FKEY 
having 
    count(*) > 1 
+0

謝謝,更正。 @Mark Ba​​nnister的解決方案雖然更好。使用計數不同很容易。 – njr101

2

嘗試用這種

select count(*),FKEY from (Select distinct FKEY,ATTRIBUTE_X from TABLEX) 
having count(*)>1 

編輯我糾正了查詢有2,而不是1點

4

而且下面應該工作:

SELECT fkey FROM mytable GROUP BY fkey HAVING MIN(attribute_x) <> MAX(attribute_x)

+0

+1 – njr101

相關問題