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 列值的行选择键、列 4 吗?

4

2 回答 2

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是您要计算的有效“其他”值,则需要额外的逻辑。

于 2013-08-27T16:11:24.967 回答
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

于 2013-08-27T16:20:43.563 回答