Предположим, у меня есть следующая таблица:

    +-------+------------+
    | nGroup |   Status   |
    +-------+------------+
    |     1 | DONE       |
    |     1 | UNKNOWN    |
    |     1 | DONE       |
    |     2 | INPROGRESS |
    |     2 | INPROGRESS |
    |     2 | DONE       |
    |     3 | INPROGRESS |
    |     3 | DONE       |
    |     3 | DONE       |
    +-------+------------+

Если nGroup имеет одно значение Status для INPROGRESS , возвращайте только строки этой группы, содержащие статус INPROGRESS .

Если все Статус в nGroup отличаются от INPROGRESS , верните все статусы, доступные для этой группы.

Так что для этого примера я бы получил следующий вывод:

+-------+------------+
| nGroup |   Status   |
+-------+------------+
|     1 | DONE       |
|     1 | UNKNOWN    |
|     1 | DONE       |
|     2 | INPROGRESS |
|     2 | INPROGRESS |
|     3 | INPROGRESS |
+-------+------------+

Я попробовал следующий запрос:

SELECT *
FROM dbo.myTable T1 
WHERE Status IN (
  CASE WHEN EXISTS( SELECT 1 FROM myTable T2 WHERE T2.STATUS = 'INPROGRESS' AND T1.nGroup = T2.nGroup) THEN 'INPROGRESS'
  ELSE (SELECT Status FROM myTable T2 WHERE T1.nGroup = T2.nGroup) 
  END
)

Но я получаю следующую ошибку при запуске:

Подзапрос вернул более 1 значения. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

0
Kimo 28 Май 2019 в 13:16

2 ответа

Лучший ответ

Это сделает это:

select m.*
from myTable m
where 
  m.Status = 'INPROGRESS' 
  OR NOT EXISTS (
    select 1 from myTable where nGroup = m.nGroup and Status = 'INPROGRESS'
  )
2
forpas 28 Май 2019 в 10:35

Ммм , , Я думаю, что вы хотите:

select t.*
from dbo.myTable t
where t.status <> 'INPROGRESS' or
      exists (select 1
              from dbo.myTable t
              where db.myTable = 'INPROGRESS'
             );
0
Gordon Linoff 28 Май 2019 в 10:28