1

我有一张看起来像的桌子

╔══════╦══════╦═══════╦═══════╦═══════╦═══════════════════╗
║ Key1 ║ Key2 ║ Data1 ║ Data2 ║ Data3 ║ DataNotImportant4 ║
╠══════╬══════╬═══════╬═══════╬═══════╬═══════════════════╣
║ Foo  ║ Bar  ║     1 ║     2 ║     a ║                 4 ║
║ Foo  ║ Bar  ║     1 ║     2 ║     a ║                 5 ║
║ Foo  ║ Bar  ║     1 ║     2 ║     b ║                 4 ║
║ Foo  ║ Test ║     1 ║     2 ║     f ║                 4 ║
╚══════╩══════╩═══════╩═══════╩═══════╩═══════════════════╝

现在我将选择 Key1 和 Key2 的组合,其中 Data1 Data2 Data3 不同,所以在这里我会得到 Foo Bar 作为结果,因为 Data3 在所有行中都不相同。我怎样才能在没有光标的情况下归档它?数据库是 SQL Server 2008

目前我使用游标。我使用 group by 选择所有组合键并遍历列表,并使用从光标获得的键在我的字段上通过 select 进行分组。问题是当有太多行时它变得非常慢。所以我寻找一个基于集合的解决方案。

4

2 回答 2

4

使用group by表达式并依赖于这样一个事实:如果一列中有不同的值,则必须暗示该列中的最小值和最大值不同:

declare @t table (key1 varchar(5),key2 varchar(5),Data1 int,Data2 int,Data3 int)
insert into @t (key1,key2,Data1,Data2,Data3) values
('Foo','Bar',1,2,3),
('Foo','Bar',1,2,3),
('Foo','Bar',1,2,4),
('Foo','Test',1,2,3)

select key1,key2 from @t
group by key1,key2
having
    MIN(data1)!=MAX(data1) or
    MIN(data2)!=MAX(data2) or
    MIN(data3)!=MAX(data3)

结果:

key1  key2
----- -----
Foo   Bar
于 2013-02-01T07:59:37.927 回答
1

您可以Group By在多个列上使用。

SELECT Key1=Min(f.key1), 
       Key2=Min(f.key2), 
       f.data1, 
       f.data2, 
       f.data3, 
       DataNotImportant4=Min(datanotimportant4) 
FROM   foo f 
GROUP  BY f.data1, 
          f.data2, 
          f.data3 
HAVING Count(*) > 1 

演示

于 2013-02-01T08:04:47.970 回答