2013-11-22 19 views
10

Come escludere i record con certi valori in SQL (MySQL)
come escludere i record con certi valori in SQL

Col1 Col2 
----- ----- 
A  1 
A  20 
B  1 
C  20 
C  1 
C  88 
D  1 
D  20 
D  3 
D  1000 
E  19 
E  1 

Return Col1 (e Col2), ma solo se il valore in Col2 è 1 o 20 , ma non se c'è anche un altro valore (diverso da 1 o 20)

risultato desiderato:

Col1 Col2 
----- ----- 
A  1 
A  20 
B  1 

ma non C, D ed e perché c'è un valore in Col2 diverso da 1 o 20

Ho usato valori fittizi per Col2 e solo due valori (1 e 20) ma in realtà ce n'è ancora.
Posso usare IN ('1', '20') per i valori 1 e 20 ma come escludere se c'è anche un altro valore in Col2. (Non c'è nessuna fascia!)

risposta

12
Select col1,col2 
From table 
Where col1 not in (Select col1 from table where col2 not in (1,20)) 
+0

Funziona bene per me! –

+0

Risposta molto bella .. semplice e potente :) – Mari

1

Usa SUM()

SELECT 
    * 
FROM 
    t 
    INNER JOIN 
    (SELECT 
    SUM(IF(Col2 IN (1, 20), 1, -1)) AS ranges, 
    col1 
    FROM 
    t 
    GROUP BY 
    col1 
    HAVING 
    ranges=2) as counts 
ON counts.col1=t.col1 

Aggiornamento: mentre si lavorerà per la lista non ripetuto, può causare gruppo errato per la tabella con i valori ripetuti (cioè 1 , 20, 20, 1 nella colonna - rimarrà comunque richiesta se le ripetizioni sono consentite, ma non l'hai menzionato). Per il caso con repliche in cui è un modo troppo:

SELECT 
    t.* 
FROM 
    t 
    INNER JOIN 
    (SELECT 
     col1, 
     col2 
    FROM 
     t 
    GROUP BY 
     col1 
    HAVING 
     COUNT(DISTINCT col2)=2 
     AND 
     col2 IN (1, 20)) AS counts 
    ON test.col1=counts.col1 

(e che funzionerà in caso comune anche, naturalmente)

+0

Si ripete. Ma non trova B 1 (solo A 1 e A 20) –

+0

Quindi, a quanto pare, ho frainteso (query sopra cerca corrispondenza esatta, cioè quando sono presenti sia '1' che' 20') –

0

si può fare lo stesso con NOT EXISTS clausola anche,

Select A.COL1,A.COL2 
From MYTABLE A 
where NOT EXISTS 
(Select COL1 from MYTABLE B where A.COL1=B.COL1 and 
COL2 NOT IN (1,20) 
GROUP BY COL1) 

liveDemo

Problemi correlati