2011-05-24 32 views
7

Tengo una tabla como talSQL seleccionar filas con sólo un cierto valor en ellos

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

¿Cómo consigo solamente únicas filas que tienen Col 3 = 1?

Quiero obtener las filas 3 y 6 (Col 2 = B y D, respectivamente). No quiero A ni C, ya que tienen Col 3 = 2 también.

he intentado algo en la línea de:

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

Pero eso sólo nos lleva a Col 2 para los resultados, así que estoy seguro de si Col 3 contenidos = 1 o no.

EDIT: Lo siento chicos tal vez no he formulado mi pregunta claramente. Quiero obtener todas las filas de Col 2 que contienen solo Col 3 = 1 Y SOLAMENTE 1.

Así que si probé DONDE Col 3= 1, devolvería 4 filas porque A tiene 1. Pero como A también tiene una fila donde Col 3 = 2, no quiero eso, lo mismo para C. De esta tabla de ejemplo, I querría el resultado final para mostrar solamente 2 filas, B y D.

Mi tabla de ejemplo es un ejemplo, que en realidad tienen cerca de 5000 filas de filtrar a través, de lo contrario, haría lo que ustedes han sugerido :)

+1

selecto * de la tabla donde el tiempo col3 = 1 – AllisonC

+5

t'is a leer una tutorial de sql: http://www.w3schools.com/sql/default.asp –

+2

Lo siento chicos, no es tan simple como parece. A menos que me falta algo inferido de esa consulta SQL por AllisonC. – MHTri

Respuesta

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

O

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

Muchas gracias, ¡esto parece haber funcionado! – MHTri

+0

también podría hacer 'HAVING AVG (col3) = 1' –

+0

¿Se supone que el segundo' b.col3 <> 1' al final? – 322896

1

Lo que probablemente esté buscando es WHERE cláusula.

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

¡eso está codificado! –

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

que es un poco difícil saber exactamente lo que está tratando de conseguir, pero esta es mi mejor conjetura:

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 con MS SQL2008 y la siguiente (por lo que si mi respuesta no es la correcta, puede probar otros halp suyo ...):

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 
Cuestiones relacionadas