Как найти конкретные значения в таблице в Oracle? - PullRequest
0 голосов
/ 05 октября 2018

Предположим, моя таблица TEST_123, в которой есть следующие записи:

id |  cid | result
------------------
1  |  C-1 |   TAM
2  |  C-1 |   TAM
3  |  C-2 |   RAM
4  |  C-2 |   TAM
5  |  C-3 |   SAM
6  |  C-3 |   SAM

Теперь я хочу получить такие cid, которые имеют только один тип результата, поэтому ответ должен быть C-1 И C-3, но неC-2, поскольку он имеет два разных типа результатов.Вам нужен запрос Oracle для этого?

Ответы [ 5 ]

0 голосов
/ 05 октября 2018

Я бы использовал NOT EXISTS:

SELECT t.*
FROM table t
WHERE NOT EXISTS (SELECT 1 FROM table t1 WHERE t1.cid = t.cid AND t1.result <> t.result);
0 голосов
/ 05 октября 2018
select t.cid from 
(select cid, count(*) as count from table_1 group by cid, result) t 
group by t.cid 
having count(*)=1;

Должно работать на вас

0 голосов
/ 05 октября 2018

Основываясь на ответе @ zaynul, вот еще один вариант:

with TEST_123 as
(
select 1 as id , 'c-1' as cid , 'tam' as result from dual
union all
select 2 as id , 'c-1' as cid , 'tam' as result from dual
union all
select 3 as id , 'c-2' as cid , 'tam' as result from dual
union all
select 4 as id , 'c-2' as cid , 'ram' as result from dual
)
select * from test_123 where cid in (
    select cid from test_123 group by cid having count(distinct result) = 1);
0 голосов
/ 05 октября 2018

Вам просто необходимо понять GROUP BY и HAVING предложения.

Ответ так же прост, как

select cid
from TEST_123
group by cid
having count(distinct result) = 1

Примечание group by выбирает отличительныйключи от CID; с фильтрами при условии, действительном для всех записей в группе , в вашем случае count(distinct result) = 1

0 голосов
/ 05 октября 2018

Использование существует, это немного сложно, потому что каждый групповой результат должен быть одинаковым

 select t1.* from TEST_123 t1 where exists(
             select 1 from TEST_123 t2 where t2.cid=t1.cid
                                      and t2.result=t1.result
                                      group by t2.cid,t2.result
                                      having count(*)=
                                       (select count(*) from TEST_123 t3
                                       where t3.cid=t2.cid)
                                      )

Пример

with TEST_123 as
(
select 1 as id , 'c-1' as cid , 'tam' as result from dual
union all
select 2 as id , 'c-1' as cid , 'tam' as result from dual
union all
select 3 as id , 'c-2' as cid , 'tam' as result from dual
union all
select 4 as id , 'c-2' as cid , 'ram' as result from dual

)

select distinct t1.cid from TEST_123 t1 where exists(
                 select 1 from TEST_123 t2 where t2.cid=t1.cid
                                          and t2.result=t1.result
                                          group by t2.cid,t2.result
                                          having count(*)=
                                           (select count(*) from TEST_123 t3
                                           where t3.cid=t2.cid)
                                          )

демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...