2015-12-03 2 views
0

Я задал вопрос here. Теперь мне нужен обратный вывод. Я следующая таблица, my_table, со структурой следующим образом,Как сделать группу куском мудрым в SQL с отрицательным условием?

Name | Address 
---------------- 
Test1 | abc_123 
Test1 | abc_456 
Test2 | xyz_123 
Test1 | xyz_123 
Test2 | xyz_456 
Test3 | abc_123 
Test4 | xyz_123 
Test1 | xyz_456 
Test3 | xyz_123 
Test4 | xyz_456 

мне нужен выход следующим образом,

Name 
------- 
Test2 
Test4 

мне нужно сделать группу по chunkwise и выберите Name, таким образом, что ни один из адрес имеет префикс как abc.

Выход Объяснение подробно:

Тест1 имеет адреса как abc_123, abc_456, xyz_123, abc_123 и, по меньшей мере, один из адреса имеет префикс как abc. Следовательно, не на выходе. Test2 имеет адреса xyz_123, xyz_456 и ни один из них не имеет префикса abc. Следовательно, на выходе.

x = select distinct(Name) from My_Table 
y = select distinct(Name) from My_Table where Address like 'abc%' 

Result = x - y 

я смог достичь результата, используя 2 запросов (как показано выше), а затем с помощью вычитания операции в наборе результатов, но это может быть достигнуто в одном запросе ?

Примечание: Я использую JAVA для запроса MYSQL DB, поэтому я могу вычесть результирующие наборы. Мой размер таблицы огромен, поэтому я хочу оптимизировать количество запросов!

ответ

2

Один метод использует агрегацию и похож на другой ответ:

select name 
from my_table 
group by name 
having sum(address like 'abc%') = 0; 

Предложение having подсчитывает количество совпадающих строк. = 0 говорит, что для данного имени нет ни одного.

+0

Awesome! Теперь, я чувствую себя глупо, поскольку я не мог думать об агрегировании. Я буду отмечать это как ответ после попытки;) – Abhishek

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