SQL выбирает строки с определенным значением - PullRequest
10 голосов
/ 24 мая 2011

У меня есть таблица как таковая

Col 1 Col 2 Col 3
1       A     1
2       A     2
3       B     1
4       C     1
5       C     2
6       D     1

Как получить только уникальные строки, в которых Col 3 = 1?

Я хочу получить строки 3и 6 (Col 2 = B и D соответственно).Я не хочу ни A, ни C, поскольку у них также есть Col 3 = 2.

Я пробовал что-то вроде:

select col 2 from table group by col 2 having count(col 3) = 1

Но этовыводит только Кол 2 для результатов, поэтому я не уверен, что содержание Кол 3 = 1 или нет.

РЕДАКТИРОВАТЬ: Извините, ребята, возможно, я не сформулировал свой вопрос четко.Я хочу получить все строки Col 2, которые содержат только Col 3 = 1 И ТОЛЬКО 1 .

Так что, если бы я попытался WHERE Col 3= 1, он вернул бы 4 строки, потому чтоимеет 1. Но так как A также имеет строку, в которой Col 3 = 2, я не хочу этого, то же самое для C. Из таблицы этого примера я хотел бы, чтобы конечный результат отображал только 2 строки, B и D.

Моя таблица примеров является примером, у меня на самом деле есть около 5000 строк для фильтрации, в противном случае я бы сделал, как вы, ребята, предложили:)

Ответы [ 5 ]

9 голосов
/ 24 мая 2011
SELECT col2
FROM your_table
GROUP BY col2
HAVING MAX(col3) = 1 AND MIN(Col3) = 1

Или

SELECT a.col2 
FROM your_table a
WHERE a.col3=1 AND NOT EXISTS(SELECT *
                              FROM your_table b 
                              WHERE a.col2=b.col2 AND b.col3<>1)
2 голосов
/ 24 мая 2011
;with T ([Col 1], [Col 2], [Col 3]) as
(
select 1,       'A',     1 union all
select 2,       'A',     2 union all
select 3,       'B',     1 union all
select 4,       'C',     1 union all
select 5,       'C',     2 union all
select 6,       'D',     1
)


select *
from T
  left outer join 
    (
      select distinct [Col 2] 
      from T
      where [Col 3] <> 1
    ) as T2
  on T.[Col 2] = T2.[Col 2]
where T.[Col 3] = 1 and
      T2.[Col 2] is null
2 голосов
/ 24 мая 2011

Вероятно, вы ищете WHERE предложение.

SELECT * FROM YouTable WHERE col3 = 1 AND col2 in ('B','D');
0 голосов
/ 24 мая 2011
SELECT * FROM #temp t1
WHERE EXISTS 
(
select Col2 from #Temp t2 
WHERE t2.Col2 = t1.Col2
group by col2 
having count(col3) = 1
)

протестировано с MS SQL2008 и следующим (поэтому, если мой ответ не правильный, это может помешать другим проверить их ...):

CREATE TABLE #temp 
( 
    Col1 INT, 
    Col2 CHAR(1),
    Col3 INT
)

INSERT INTO #Temp    
    (Col1, Col2, Col3)
SELECT    1,'A',1
UNION
SELECT    2,'A',2
UNION
SELECT  3,'B', 1
UNION 
SELECT 4,'C',1
UNION 
SELECT 5,'C',2
UNION 
SELECT 6,'D',1

SELECT * FROM #temp t1
WHERE EXISTS 
(
select Col2 from #temp t2 
WHERE t2.Col2 = t1.Col2
group by col2 
having count(col3) = 1
)

DROP TABLE #temp
0 голосов
/ 24 мая 2011

Трудно точно понять, что вы пытаетесь получить, но это мое лучшее предположение:

SELECT * FROM theTable WHERE col2 NOT IN
  (SELECT col2 FROM theTable WHERE col3 <> 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...