【问题标题】:find different data with sql用sql查找不同的数据
【发布时间】:2013-02-01 07:55:03
【问题描述】:

我有一个看起来像的表格

╔══════╦══════╦═══════╦═══════╦═══════╦═══════════════════╗
║ 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 进行分组。 问题是当有太多行时它变得非常慢。 所以我寻找一个基于集合的解决方案。

【问题讨论】:

标签: sql tsql


【解决方案1】:

使用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

【讨论】:

  • 感谢您的回答我忘记了数据字段并不总是数字,对不起
  • @Sebastian - 没关系 - 只要 MIN()MAX() 处理这些数据类型,它仍然是正确的。 "MIN 可以与 numeric、char、varchar、uniqueidentifier 或 datetime 列一起使用,但不能与 bit 列一起使用。"
  • (较慢的)替代方案是COUNT(DISTINCT data1) > 1 OR ...
  • 位域应该怎么做?
  • MIN(CONVERT(int,bitcolumn)) ...
【解决方案2】:

您可以在多个列上使用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 

Demo

【讨论】:

  • 这不是错误的分组方式吗?如果第 4 行的值为 ABC,您的查询将返回 Foo,Abc 而不是 Foo,Bar
  • @Damien_The_Unbeliever:我不确定。第 4 行中的ABC 应该是什么?我是这样理解的:根据列data1+data2+data3获取一组重复行的任意单行。
  • “其中 Data1 Data2 Data3 不同”向我暗示它们不是 group by 列。
猜你喜欢
  • 2013-08-16
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多