2011-05-24 7 views
7

Mam tabeli jako takiSQL SELECT wiersze tylko pewnej wartości w nich

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

Jak mogę dostać tylko unikalne wiersze, które mają Kol 3 = 1?

Chcę uzyskać wiersze 3 i 6 (Col 2 = B i D odpowiednio). Nie chcę A ani C, ponieważ mają również Col 3 = 2.

Próbowałem coś wzdłuż linii:

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

Ale to tylko wychowuje Kol 2 do wyników, więc jestem pewien, czy Kol 3 zawartość = 1, czy nie.

EDIT: Przykro mi, chłopaki, może nie powiedziałem wyraźnie mojego pytania. Chcę uzyskać wszystkie wiersze Col 2, które zawierają tylko Col 3 = 1 I TYLKO 1.

Więc jeśli spróbowałem GDZIE , to zwróciłoby 4 wiersze, ponieważ A ma 1. Ale ponieważ A również ma wiersz, w którym Col 3 = 2, nie chcę tego, to samo dla C. Z tej przykładowej tabeli, I chciałbym, aby wynik końcowy pokazywał tylko 2 wiersze, B i D.

Moja przykładowa tabela jest przykładem, faktycznie mam około 5000 wierszy do przefiltrowania, w przeciwnym razie zrobiłbym to, co zaproponowaliście:

+1

select * z tabeli gdzie czas Col3 = 1 – AllisonC

+5

t'is czytać Samouczek sql: http://www.w3schools.com/sql/default.asp –

+2

Przykro mi, chłopaki, to nie jest tak proste, jak się wydaje. Chyba że brakuje mi czegoś wywnioskowanego z tego zapytania SQL przez AllisonC. – MHTri

Odpowiedz

6
SELECT col2 
FROM your_table 
GROUP BY col2 
HAVING MAX(col3) = 1 AND MIN(Col3) = 1 

Albo

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) 
+0

Dziękuję bardzo, wygląda na to, że zadziałało! – MHTri

+0

można również zrobić "HAVING AVG (col3) = 1" –

+0

Czy drugi ma być "b.col3 <> 1" na końcu? – 322896

1

Prawdopodobnie szukasz klauzuli WHERE.

SELECT * FROM YouTable WHERE col3 = 1 AND col2 in ('B','D'); 
+0

to jest zakodowane! –

2
;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 
0

To trochę trudno wiedzieć dokładnie, co starasz się dostać, ale to jest mój najlepszy przypuszczenie:

SELECT * FROM theTable WHERE col2 NOT IN 
    (SELECT col2 FROM theTable WHERE col3 <> 1) 
0
SELECT * FROM #temp t1 
WHERE EXISTS 
(
select Col2 from #Temp t2 
WHERE t2.Col2 = t1.Col2 
group by col2 
having count(col3) = 1 
) 

t ested z MS SQL2008 i następujące (więc jeśli moja odpowiedź nie jest prawidłowa może HALP inni przetestować ich kompetencji ...):

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 
Powiązane problemy