对b字段进行排序(分组)时,相同值的c被分到不同的组,所以不能用COUNT(DISTINCTc)来计算大小。COUNT()等内部函数只作用于同一组,对不同组的行无能为力。同样,如果对c字段进行排序,同样值的b也会被分到不同的组中,无论如何也达不到我们的目的。几种正确的方法或许最简单的方法就是找到某个字段的重复行,然后用UNION把它们拼在一起,像这样:selectbasvalue,count(*)ascnt,'b'aswhat_colfroma_b_cgroupbybhavingcount(*)>1unionselectcasvalue,count(*)ascnt,'c'aswhat_colfroma_b_cgroupbyhavingcount(*)>1;+-------+-----+--------+|value|cnt|what_col|+-------+-----+----------+|1|3|b||2|3|b||3|3|b||1|3|c||2|3|c||3|3|c|+------+-----+----------+输出what_col字段提示哪一个重复场地。另一种方法是使用嵌套查询:selecta,b,cfroma_b_cwherebin(selectbfroma_b_cgroupbybhavingcount(*)>1)orcin(selectcfroma_b_cgroupbyhavingcount(*)>1);+----+------+-----+|a|b|c|+----+------+-----+|7|1|1||8|1|2||9|1|3||10|2|1||11|2|2||12|2|3||13|3|1||14|3|2||15|3|3|+----+------+------+这种方法比使用UNION效率低得多,并且显示每个重复的行而不是重复的字段值。还有一种方法是将表查询与组的嵌套查询结果进行join。写法比较复杂,但是对于复杂的数据或者对效率要求高的情况是必须的。selecta,a_b_c.b,a_b_c.cfroma_b_cleftouterjoin(selectbfroma_b_cgroupbybhavingcount(*)>1)asbona_b_c.b=b.bleftouterjoin(selectcfroma_b_cgroupbychavingcount(*)>1)ascona_b_c.cullc.cwherebu.biscinullc.biscinull还有其他方法。如果能用UNION,我觉得会是最简单的。
