2013-08-27 44 views
1

我試圖找出違反唯一鍵索引的問題。我很確定,原因是由於在第3列中具有相同值的列(第4列中沒有相同值)(在他們應該的時候)。作爲一個例子...查找具有許多相似值和一個不同的值的行

Key Column1 Column2 Column3 Column4 
1  A   B   C   D 
2  A   B   C   D 
3  A   B   C   D 
4  A   B   C   Z 

我基本上要選擇第4列,或某種方式讓我找出列4.我知道這是用匯集起來的功能的問題,但我不是很熟悉他們。任何人都可以幫助選擇具有不同列4值和相同列1-3值的行的Key,Column4?

回答

1

這是你想要什麼:

select column1, column2, column3 
from t 
group by column1, column2, column3 
having min(column4) <> max(column4) 

一旦你獲得了正確的價值觀爲前三個欄,您可以加入回獲得特定行。

或者,你可以使用窗口函數像這樣:

select t.* 
from (select t.*, min(column4) over (partition by column1, column2 column3) as min4, 
      max(column4) over (partition by column1, column2 column3) as max4 
     from t 
    ) t 
where min4 <> max4; 

如果NULL是一個有效的「其他」值要計算,你將需要爲額外的邏輯。

1

如果你想獲得的所有列,然後(它可能如果窗count支持distinct是簡單,但它不是):

with cte1 as (
    select distinct * from Table1 
), cte2 as (
    select 
     *, 
     count(column4) over(partition by column1, column2, column3) as cnt 
    from cte1 
) 
select * from cte2 where cnt > 1; 

如果你只想選擇鍵:

select 
    column1, column2, column3 
from Table1 
group by column1, column2, column3 
having count(distinct column4) > 1 

sql fiddle demo

相關問題