有點意思的sql

同事問我一個問題,要我寫幾條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還是有點難度的,有點意思,學習一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章