排除特定类型的记录

时间:2013-10-07 12:25:10

标签: sql sql-server tsql sql-server-2008-r2

我正在使用SQL Server 2008 R2。我确实在表格中有如下记录:

Id  Sys   Dia   Type        UniqueId
1   156   20    first       12345
2   157   20    first       12345
3   150   15    last        12345
4   160   17    Average     12345
5   150   15    additional  12345
6   157   35    last        891011
7   156   25    Average     891011
8   163   35    last        789521
9   145   25    Average     789521
10  156   20    first       963215
11  150   15    last        963215
12  160   17    Average     963215
13  156   20    first       456878
14  157   20    first       456878
15  150   15    last        456878
16  160   17    Average     456878
17  150   15    last        246977
18  160   17    Average     246977
19  150   15    additional  246977

关于此数据,这些记录是具有共同UniqueId的一类组。记录可以是"第一,最后,平均和附加"。现在,从这些记录我想选择"平均"记录类型,只有他们有"第一"或者"额外的"小组阅读。否则我想将它们从选择中排除..

预期结果是:

Id  Sys   Dia   Type        UniqueId
1   156   20    first       12345
2   157   20    first       12345
3   150   15    last        12345
4   160   17    Average     12345
5   150   15    additional  12345
6   157   35    last        891011
7   163   35    last        789521
8   156   20    first       963215
9   150   15    last        963215
10  160   17    Average     963215
11  156   20    first       456878
12  157   20    first       456878
13  150   15    last        456878
14  160   17    Average     456878
15  150   15    last        246977
16  160   17    Average     246977
17  150   15    additional  246977

简而言之,我不想选择类型="平均值"并且只有"最后"具有相同UniqueId的记录类型。任何解决方案?

2 个答案:

答案 0 :(得分:2)

尝试这样的事情:

SELECT * FROM MyTable WHERE [Type] <> 'Average'
UNION ALL
SELECT * FROM MyTable T WHERE [Type] = 'Average'
    AND EXISTS (SELECT * FROM MyTable 
                WHERE [Type] IN ('first', 'additional') 
                    AND UniqueId = T.UniqueId)

第一个SELECT语句获取除Type ='Average'之外的所有记录。第二个SELECT语句只获得Type ='Average'记录,这些记录至少有一个具有相同UniqueId的记录,即'first'或'additional'类型。

答案 1 :(得分:2)

在相关子查询中使用EXISTS运算符:

SELECT * FROM dbo.Table1 t1
WHERE [Type] != 'Average' 
OR EXISTS (SELECT * FROM Table1 t2 
           WHERE t1.UniqueId = t2.UniqueId 
             AND t1.[Type] = 'Average' 
             AND t2.[Type] IN ('first','additional'))

<强> SQLFiddle DEMO