如果多余的列在 功能上取决于 您分组的列,则可以“安全”地使用这些查询,即不会导致歧义的结果:
SELECt c.parent_id, COUNT(*), p.any_columnFROM child_table c JOIN parent_table p USING (parent_id)GROUP BY c.parent_id;
上面的示例将在SQLite中工作,并产生明确的结果,因为
p.any_column每个组不可能有多个值。但是,此查询严格违反SQL标准,并且大多数品牌的RDBMS都会引发错误。
但是,编写产生歧义结果的查询太容易了。当命名每个组具有多个值的列时,您将无法控制在结果集中返回哪个值。
实际上,MySQL从物理存储的 第一 行返回该值,而SQLite从 最后
一行返回该值。但这完全依赖于实现且不可靠。如果任一软件的下一版本更改了内部结构,则升级后您可能会获得不同的查询结果。因此,最好不要依赖此行为。
对于您的示例,where
content应该“直观地”具有
sequenceMAX为行中的值。但这真的很直观吗?考虑以下其他情况:
SELECt MAX(sequence), MIN(sequence), type, contentFROM messageGROUP BY type
那么,现在哪一行提供了价值
content?行
sequence是MAX,还是行
sequenceMIN?
如果您使用非唯一列(例如
date),并且有多行具有相同的MAX值
date,但具有不同的值
content怎么办?
SELECt MAX(date), type, contentFROM messageGROUP BY type
其他聚合函数(例如
AVG()或)
SUM()呢?汇总的值可能对应于表中没有单独的行。那么,现在应该为哪一行提供值
content?
SELECt AVG(sequence), type, contentFROM messageGROUP BY type



