2013-10-07 3 views
0

Я использую 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

Использование 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

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) 

Первый ЗЕЬЕСТ получает все записи, кроме тех, с Type = «Среднее значение». Второй оператор SELECT получает только записи Type = 'Average', которые имеют по крайней мере одну запись с тем же UniqueId, которая имеет тип «первый» или «дополнительный».

+1

Идея в порядке, вы должны просто заменить '' UNION' с UNION ALL'. Поскольку оба подмножества являются взаимоисключающими, нет риска дублирования данных, поэтому результаты будут одинаковыми, но «UNION ALL» работает намного быстрее. –

+0

@NenadZivkovic - Спасибо, ты абсолютно прав. Я отредактировал свой ответ. – Dan

Смежные вопросы