同事問我一個問題,要我寫幾條sql。假設表temp的結構是這樣的:
字段: id, name
有這些記錄:
123, foo
123, bar
123, test
124, test
125 foo
126 bar
127 foo
127 test
128 foo
128 bar
128 test
128 else
現在要寫4條sql,找到符合下面四個條件的id:
1. 只有name = foo
2. 只有name = bar
3. name = foo以及name = bar
4. name != foo以及name != bar
第1條開始寫出了這樣的sql:
SELECT Id FROM temp WHERE Id IN (SELECT Id FROM temp GROUP BY Id HAVING COUNT(*) = 1) AND Name = 'foo'
顯然不對,比如127這個Id就漏了。不過,同事的要求是不需要找出全部記錄,隨便找出幾個就行了,所以這個還能滿足要求。
第3條想了一會,寫出來了
SELECT T1.Id FROM ( SELECT Id FROM temp WHERE Name = 'foo' GROUP BY Id ) as T1 INNER JOIN ( SELECT Id FROM temp WHERE Name = 'bar' GROUP BY Id ) as T2 ON T1.Id = T2.Id
第4條想不出,查了資料,寫法很巧妙
SELECT Id FROM ( SELECT Id, MAX(CASE WHEN Name IN ('foo', 'bar') THEN 1 ELSE 0 END) AS flag FROM temp GROUP BY Id ) as T WHERE T.flag = 0
回過頭來,第1條可以這樣寫
SELECT Id FROM ( SELECT Id, MAX(CASE WHEN Name = 'foo' THEN 1 ELSE 0 END) AS flag FROM temp GROUP BY Id ) as T WHERE T.flag = 1
第2條就很容易了,把foo 換成bar就好了。這個sql還是有點難度的,有點意思,學習一下。