2015-08-18 3 views
0

У меня есть таблица, которая выглядит следующим образом:SELECT, записи с условием из более чем одной строки

KID  GRP 
1   ABS 
1   AOR 
1   AOR 
2   ABS 
2   ABS 
2   ABS 
2   AOR 
2   ZVN 
3   ABS 

И мне нужно, чтобы найти все Кид, которые имеют GRP как ABS и AOR. Таким образом, ожидаемый результат равен 1 и 2.

Какой оператор SELECT может найти эту запись?

Заранее спасибо ...

ответ

1

Один из вариантов, с использованием коррелированных подзапросов:

SELECT DISTINCT KID  
FROM TableName t 
WHERE EXISTS(SELECT 1 FROM TableName t2 
      WHERE t2.GRP='ABS' AND t.KID=t2.KID) 
    AND EXISTS(SELECT 1 FROM TableName t2 
      WHERE t2.GRP='AOR' AND t.KID=t2.KID) 

Demo

Вот еще один способ использования GROUP BY что лучше, если список растет:

SELECT KID  
FROM TableName t 
WHERE t.GRP IN('ABS', 'AOR') 
GROUP BY KID 
HAVING COUNT(DISTINCT t.GRP) = 2 

Demo

+0

Я не вижу, чтобы какое-либо агрегирование выполнялось в запросе (я думаю, что это то, что входит в картину). У нас есть какое-то преимущество/выигрыш в производительности, когда мы используем предложение where вместо предложения where? Просто из любопытства. –

+0

@ VamsiKrishna: обратите внимание, что я отредактировал свой ответ. Элемент 'Have' фильтрует группу,' Where' фильтрует записи перед созданием групп. –

+0

Да, я это видел. Ну, я был бы рад, если на мой вопрос можно будет ответить. –

0
select kid from tablename where grp = 'ABS' 
intersect 
select kid from tablename where grp = 'AOR' 

Вы можете использовать intersect, если база данных позволяет.

0

Вы можете использовать комбинацию Где и Exists

select kid from tablename a where exists 
(select 1 from tablename b where b.KID = a.KID and b.GRP = 'ABS') 
and GRP = 'AOR' 

Это также обеспечит вы получите только один результат для каждого KID без использования distinct

2

Вы можете попробовать:

SELECT KID  
FROM mytable 
WHERE GRP IN ('ABS', 'AOR') 
GROUP BY KID 
HAVING COUNT(DISTINCT GRP) = 2 

Предложение WHERE отфильтровывает любые строки не ('ABS', 'AOR'). Предложение HAVING гарантирует, что выбраны только те значения KID, которые связаны с как('ABS', 'AOR').