2011-05-24 4 views
7

Ho una tabella in quanto taleSQL SELECT le righe con solo un certo valore in loro

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

Come posso solo ottenere unici righe che hanno Col 3 = 1?

Voglio ottenere le righe 3 e 6 (Col 2 = B e D rispettivamente). Non voglio A né C poiché hanno anche Col 3 = 2.

Ho provato qualcosa sulla falsariga di:

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

Ma che porta solo fino Col 2 per i risultati, quindi sono incerto se Col 3 contenuti = 1 o meno.

MODIFICA: Scusate ragazzi forse non ho formulato la mia domanda chiaramente. Voglio ottenere tutte le righe di Col 2 che contengono solo Col 3 = 1 E SOLO 1.

Quindi, se provassi WHERE Col 3= 1, restituire 4 righe perché A ha 1. Ma poiché A ha anche una riga dove Col 3 = 2, non lo voglio, lo stesso per C. Da questa tabella di esempio, I vorrebbe il risultato finale per visualizzare solo 2 file, B e D.

la mia tabella di esempio è un esempio, io in realtà sono circa 5000 righe da filtrare, altrimenti avrei fatto come voi ragazzi hanno suggerito :)

+1

select * from tabella in cui il tempo col3 = 1 – AllisonC

+5

t'is a leggere un tutorial sql: http://www.w3schools.com/sql/default.asp –

+2

Scusate ragazzi, non è così semplice come sembra. A meno che non manchi qualcosa derivato da quella query SQL di AllisonC. – MHTri

risposta

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

Grazie mille, sembra che abbia funzionato! – MHTri

+0

si potrebbe anche fare 'AVVISO AVG (col3) = 1' –

+0

Alla fine il secondo dovrebbe essere' b.col3 <> 1'? – 322896

1

Quello che stai probabilmente cercando è la clausola WHERE.

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

questo è difficile da codificare! –

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

È un po 'difficile sapere esattamente cosa si sta cercando di ottenere, ma questo è il mio migliore ipotesi:

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 INTERESSATE con MS SQL2008 e il successivo (quindi se la mia risposta non è quello corretto, può HALP altri testare la loro ...):

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 
Problemi correlati