モノノフ日記

普通の日記です

MySQLのCOUNT関数が標準SQLと仕様が違って嵌った

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

達人に学ぶ SQL徹底指南書 (CodeZine BOOKS)

上記の本の演習問題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;