И так как обычно есть несколько способов решить любую проблему, вот еще один.
У вас вопрос довольно нормальный. Выберите набор данных, который удовлетворяет условиям N . В этом случае их всего два, и оба требуют наличия определенного типа строки для заданных значений. Таким образом, другой способ получить это - использовать предложение EXISTS
.
Это логически очень похоже на метод Джейсона, использующий предложения IN
. Ответ Джейсона , кстати, заслуживает того, чтобы быть выбранным в качестве ответа. Я просто предлагаю это как альтернативный подход, чтобы помочь вам сохранить ваши параметры открытыми.
В предложении EXISTS
используется «коррелированный подзапрос», что означает, что значение из external query, table1 as t1
, используется внутренними запросами (внутри скобок, если это помогает вам представить его), обычно в предложении WHERE
внутреннего запроса.
Итак, каждое из предложений EXISTS
ищет любое вхождение условий в их предложениях WHERE
; имена совпадают, а суммы соответствуют их критериям. Если найдено любое вхождение , запрос возвращает набор результатов, который EXISTS
интерпретирует как ИСТИНА. Если нет, ничего не возвращается, что EXISTS
интерпретирует как ЛОЖЬ. Обратите внимание, что результаты внутреннего запроса вообще не имеют значения, просто удовлетворяется предложение WHERE
или нет. Поэтому я использую SELECT 1
, чтобы показать, что возвращаемое значение не имеет значения. На самом деле вы можете положить туда все, что захотите; даже 1/0
, и он будет работать просто отлично.
select
*
from
table1 as t1
where
exists (select 1
from table1 as t2
where t2.amount = 0
and t2.Name = t1.Name)
and
exists (select 1
from table1 as t3
where t3.amount > 0
and t3.Name = t1.Name);
Смотрите его в действии здесь: Rextester demo