2015-10-26 2 views
1

У меня есть таблица, содержащая идентификатор, тип.Выберите все строки, которые имеют только определенное значение в записях

Я хочу выбрать все идентификаторы, которые имеют только одну или несколько записей одного и того же типа.

Например,

Предполагая, что это мой стол:

id type 
456  4 
123  4 
123  4 
123 18 
123  4 
789  4 
789  4 
000  7 

Я хочу, чтобы получить идентификаторы: 456789 вызывают эти идентификаторы имеют только записи с типом = 4:

456 имеет одну запись , и 789 имеет две записи типа = 4.

123 имеет тип = 4, но имеет тип = 18.

Как я могу это сделать?

Я знаю, что могу использовать раздел, но я хочу что-то вроде присоединиться/существует ..

http://sqlfiddle.com/#!9/731e1

+1

Итак, вы хотите, чтобы выбрать все строки, в которых есть ли 'не exist' другой строки с тем же идентификатором, но другим типом? Хм, интересно, как вы могли это сделать ... –

ответ

4

Вы можете использовать:

SELECT id 
FROM cards 
GROUP BY id 
HAVING MIN(type) = MAX(type) 

Demo here

+1

Вау, я думал о подзапросе с существующим, но это ... намного лучше. –

+0

Это не работает на сервере SQL, но работает на sqlFiddle: SELECT, идентификатор, тип, состояние с карт GROUP BY ид HAVING MIN (типа) = MAX (тип) и тип = 4 –

+0

Почему вы добавляете 'type = 4' в разделе' HAVING'? –

3
Select Id 
FROM cards 
GROUP BY Id 
HAVING COUNT(DISTINCT [type]) = 1 
+1

Мне это нравится, потому что его можно легко изменить, чтобы найти идентификаторы, имеющие только два или максимум два типа. – trincot

0

I не думаю, что @ M.Ali отвечает на ваш критерий. Его ResultSet включает в себя «000»

if OBJECT_ID('Tempdb..#Work') is not null 
    drop table #Work; 
Create Table #Work (Id char(3), [Type] int) 
insert into #Work values 
('456', 4) 
, ('123', 4) 
, ('123', 4) 
, ('123', 18) 
, ('123', 4) 
, ('789', 4) 
, ('789', 4) 
, ('000', 7) 

select distinct * 
from #Work a 
where exists (
       select Type 
        ,Count(Distinct Id) cntId 
       from #Work b 
       where a.Type = b.Type 
       group by Type 
       having Count(Distinct Id) > 1 
      ) 
and exists (
     select Id 
      ,count(distinct Type) 
     from #Work c 
     where a.Id = c.Id 
     group by id 
     having count(distinct type)= 1 
    ) 

выхода ID =:

Id Type 
---- ----------- 
456 4 
789 4 
Смежные вопросы