Oracle / SQL - поиск записей с одним значением, исключая похожие записи - PullRequest
1 голос
/ 02 марта 2011

Хорошо, позвольте мне лучше объяснить это.Предположим, у меня есть столбец персонажа и столбец типа.Один и тот же человек может быть в таблице несколько раз, но с разными типами.Я хочу, чтобы все люди с указанным типом, ЕСЛИ они перечислены с другими типами.

Поэтому, учитывая эти данные

Person  Type
--------------
Bob     S
Sue     S
Bob     O
Tom     S
Frank   S
Frank   R

, я хочу видеть людей, которые имеют тип S, нотакже не указан ни с типом O, ни с R. Поэтому мой запрос должен возвращать

Person  Type
--------------
Sue     S
Tom     S

Спасибо!

Ответы [ 7 ]

2 голосов
/ 03 марта 2011

Это будет делать:

SELECT person
FROM table
GROUP BY person
HAVING MIN(type) = 'S' AND MAX(type) = 'S'

Однако, если у вас есть несколько записей для одного и того же человека и введите 'S', тогда эти дубликаты будут удалены

0 голосов
/ 03 марта 2011

Мне нравится вариант Гэри по соображениям производительности, но более простой метод:

SELECT Person FROM mytable WHERE Type = 'S'
MINUS
SELECT Person FROM mytable WHERE Type IN ('O','R');
0 голосов
/ 02 марта 2011

Как насчет этого:

SELECT  person, type 
FROM      MyTable   t1 
WHERE (
        SELECT COUNT( DISTINCT  type ) 
        FROM @MyTable t2 
        WHERE t2.person = t1.person 
        AND  t1.Type='s'
        ) = 1
GROUP BY person, type 
0 голосов
/ 02 марта 2011
SELECT DISTINCT person, ptype FROM persons p1 
WHERE (SELECT COUNT( DISTINCT ptype ) 
FROM persons p2 
WHERE p2.person = p1.person) = 1;
0 голосов
/ 02 марта 2011

В качестве опции к синтаксису NOT IN, внешнее объединение может обработать это тоже

select t1.person, t1.type    
from   person_Type t1, person_type t2
where  t1.person = t2.person(+)
and    t1.type != t2.type(+)
and    t1.type = 'S'
and    t2.type is null;

Или, в ответ на комментарий - для тех, кто предпочитает синтаксис ANSI ...

select t1.person, t1.type
from  person_type t1
left outer join person_type t2
on  t2.person = t1.person
and t2.type != t1.type
where t1.type = 'S'
and t2.type is null;
0 голосов
/ 02 марта 2011

Может быть, что-то вроде этого:

select distinct Person, Type
from table
where (Person, type) in
  (select distinct Person, Type
   from table
   having count(*) = 1)  

Добавлено отличия для обработки вашего дела.

0 голосов
/ 02 марта 2011
select person, type
    from myTable
    where type = 'S'
        and person NOT IN (
            select person
                from myTable
                where type in ('O', 'R')
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...