2013-10-17 62 views
0

假設我在Oracle數據庫如下表:甲骨文 - 查找匹配的記錄用不同的值一個字段

Col1:  Col2: ... Coln: 
1   a  ... 1 
1   a  ... 1 
1   b  ... 1 
1   b  ... 1 
1   c  ... 1 
1   a  ... 1 
2   d  ... 1 
2   d  ... 1 
2   d  ... 1 
3   e  ... 1 
3   f  ... 1 
3   e  ... 1 
3   e  ... 1 
4   g  ... 1 
4   g  ... 1 

而且,我想是的記錄,其中,爲Col1鮮明的列表,Col2是不同的 - 忽略Col2匹配所有Col1的任何時間。

因此,在這個例子中,我想獲得的結果集:

Col1:  Col2: 
1   a  
1   b  
1   c  
3   e  
3   f 

現在,我想通了,如何使用,感覺手頭的問題相當複雜的查詢做到這一點:

With MyData as 
(
    SELECT b.Col1, b.Col2, count(b.Col2) over(Partition By b.Col1) as cnt from 
    (
    Select distinct a.Col1, a.Col2 from MyTable a 
    ) b 
) 

select Col1, Col2 
from MyData 
where cnt > 1 
order by Col1 

什麼我不知道是什麼,是一個更好的辦法做到這一點 - 我沒能做到這一點使用GROUP BY & HAVING,可能認爲這也許可以使用自加入...這是更要做一個觀察/學習新方法獲得重新認識的人導致更好的(也許更有效)查詢。

謝謝!

回答

3

嘗試此查詢:

SELECT distinct * 
FROM table1 t1 
WHERE EXISTS 
(SELECT 1 FROM table1 t2 
    WHERE t1.col2 <> t2.col2 
    AND t1.col1 = t2.col1 
) 
order by 1,2 

演示:http://www.sqlfiddle.com/#!4/9ce10/12

-----編輯-------

是的,還有其他的方法來做到這一點:

SELECT distinct col1, col2 
FROM table1 t1 
WHERE col2 <> ANY (
    SELECT col2 FROM table1 t2 
    WHERE t1.col1 = t2.col1 
) 
order by 1,2; 

SELECT distinct col1, col2 
FROM table1 t1 
WHERE NOT col2 = ALL (
    SELECT col2 FROM table1 t2 
    WHERE t1.col1 = t2.col1 
) 
order by 1,2 
; 

SELECT distinct t1.col1, t1.col2 
FROM table1 t1 
JOIN table1 t2 
ON t1.col1 = t2.col1 AND t1.col2 <> t2.col2 
order by 1, 2 
; 


SELECT t1.col1, t1.col2 
FROM table1 t1 
JOIN table1 t2 
ON t1.col1 = t2.col1 
GROUP BY t1.col1, t1.col2 
HAVING COUNT(distinct t2.col2) > 1 
order by 1, 2 
; 


SELECT t1.col1, t1.col2 
FROM 
table1 t1 
JOIN (
    SELECT col1 
    FROM table1 
    GROUP BY col1 
    HAVING COUNT(distinct col2) > 1 
) t2 
ON t1.col1 = t2.col1 
GROUP BY t1.col1, t1.col2 
ORDER BY t1.col1, t1.col2 
; 

演示 - >http://www.sqlfiddle.com/#!4/9ce10/33

嘗試一切,我真的不知道他們將如何執行您的數據。
但是,創建一個綜合指數:

CREATE INDEX name ON table1(col1, col2) 

將最有可能加速這些查詢。

+0

這是行得通! - 謝謝!!!僅僅爲了我的教育,這會比我寫查詢的方式更有效率嗎?另外,由於這只是爲了我學習,你能想出其他方法來做到這一點嗎? - 我只是好奇,看看有什麼可用來增加我的SQL實力:) –

+0

和!!!再次感謝! –

+1

我很高興我能幫上忙。我附加了一些熱門的例子,以其他方式做到這一點 - 僅用於學習目的。 – krokodilko

1

下面是一個使用聚合和分析功能的方法:

with t as (
     select col1, col2, 
      count(*) over (partition by col1) as cnt 
     from table1 
     group by col1, col2 
    ) 
select col1, col2 
from t 
where cnt > 1; 

我想要做的是:

select col1, col2, 
     count(*) over (partition by col1) as cnt 
    from table1 
    group by col1, col2 
    having count(*) over (partition by col1) > 1; 

然而,這不是有效的SQL,因爲分析功能having條款中不允許。

+0

感謝您的支持,但不幸的是,'count'也會計算具有相同值的重複記錄,所以它會計算出「Col2」的非重複值:( –

+0

您有其他想法嗎? ?不幸的是,我會提前告訴你,我將把Kordirko標記爲正確的答案,因爲他是第一個解決這個問題的解決方案,但是如果你願意幫助我指導正確的學習目的,我將不勝感激!!!!! –