MySQLのCOUNT関数が標準SQLと仕様が違って嵌った
達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)
- 作者: ミック
- 出版社/メーカー: 翔泳社
- 発売日: 2008/02/07
- メディア: 単行本(ソフトカバー)
- 購入: 46人 クリック: 938回
- この商品を含むブログ (74件) を見る
上記の本の演習問題10-1の模範解答がMySQLで動かないので公式マニュアルを調べてみた。
COUNT(DISTINCT expr,[expr...])
異なる非 NULL 値の数を戻します。
一致する行がない場合、COUNT(DISTINCT) は 0 を戻します。
mysql> SELECT COUNT(DISTINCT results) FROM student;
MySQL では、式のリストを提供することにより、NULL を含まない、異なる式のコンビネーションの数を得ることができます。標準 SQL では、COUNT(DISTINCT ...) 内で、すべての式の連結を行わなければなりません。
http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html
どうやらMySQLではCOUNT(DISTINCT FOO || BAR)じゃなくてCOUNT(DISTINCT FOO, BAR)と書かなくちゃいけないみたい。COUNT()の場合は前者の書き方でOK。こんな方言いらないのに。。
SELECT center FROM Materials2 GROUP BY center HAVING COUNT(material || orgland) <> COUNT(DISTINCT material, orgland);
ちなみに自分で考えた解答はEXISTS使ってた。全く美しくない。。。
select center FROM Materials2 M1 WHERE EXISTS (SELECT * FROM Materials2 M2 WHERE M1.center = M2.center AND M1.receive_date <> M2.receive_date AND M1.material = M2.material AND M1.orgland = M2.orgland) GROUP BY center;