2013-11-22 25 views
10

具有一定值的記錄如何排除某些值的記錄在SQL(MySQL的)
如何排除在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 

返回Col1中(和col2上),但只有在col2的值是1或20 ,但如果也有(比1或20之外)的另一個值

期望的結果:

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

但不是C,d和E,因爲有在Col2中比1或20以外的值
我已經使用Col2的虛擬值,只有兩個值(1和20),但實際上還有一些值。
我可以使用IN('1','20')作爲值1和20,但如何排除Col2中還有其他值。 (有沒有範圍!)

回答

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

適合我! –

+0

非常好的答案..簡單而強大:) – Mari

1

使用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 

更新:雖然它會爲不重複的名單工作,它可能會導致一系列錯誤的表重複的值(即120,20,1列 - 它仍然適合請求,如果重複允許,但你沒有提到)。對於情況有重複地方太辦法:

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 

(這將在通常情況下工作過,當然)

+0

它重複。但它沒有找到B 1(只有A 1和A 20) –

+0

然後,看起來,我誤解了(上面的查詢完全匹配查詢,即當'1'和'20'都存在時) –

0

你可以做同樣的NOT EXISTS條款也

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