我的表格 MYTABLE 有两列: A 和 B
我有以下代码:
SELECT MYTABLE.A FROM MYTABLE
HAVING SUM(MYTABLE.B) > 100
GROUP BY MYTABLE.A
和
SELECT MYTABLE.A FROM MYTABLE
GROUP BY MYTABLE.A
HAVING SUM(MYTABLE.B) > 100
它是一样的吗?这两个代码是否有可能返回不同的结果集?
提前谢谢
答案 0 :(得分:9)
据记载,没有区别。人们习惯于在GROUP BY之后看到HAVING。
http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_10002.htm#SQLRF20040
在where_clause和hierarchical_query_clause之后指定GROUP BY和HAVING。如果同时指定GROUP BY和HAVING,则它们可以按任何顺序出现。
答案 1 :(得分:2)
我最初写道:
甲骨文医生大卫·阿尔德里奇(David Aldridge)纠正了我的错误,该命令并不重要。虽然我不建议在GROUP之前使用HAVING以便于阅读(并且为了防止与WHERE子句混淆),但从技术上讲它是正确的。这样就可以回答你的问题'是的,它是一样的'。我不确定您的第一个查询是否有效。据我所知,HAVING应该总是在GROUP BY之后。
答案 2 :(得分:0)
HAVING
之前不能有GROUP BY
,HAVING
就像“WHERE
”而是GROUP BY
条件。
答案 3 :(得分:0)
按顺序评估条款。您可以在FROM子句后立即使用HAVING子句。在这种情况下,HAVING子句将应用于结果集的整个行。在这种情况下,选择列表可能只包含HAVING子句中包含的一个/多个/所有聚合函数。
因此,由于上述原因,您的第一个查询无效。有效的查询将是
SELECT SUM(MYTABLE.B) AS s FROM MYTABLE
HAVING SUM(MYTABLE.B) > 100
上述查询将返回一行或不返回行,具体取决于条件SUM(MYTABLE.B) > 100
是否已经过验证。
但是,还有一个原因是您的第一个查询无效。 GROUP BY子句可以仅引用它所适用的数据集中的列。继续上面的有效查询,您可以编写以下有效查询(尽管它将无用且无意义,因为它应用于一行或无行):
SELECT SUM(s)
FROM
(
SELECT SUM(MYTABLE.B) s
FROM MYTABLE
HAVING SUM(MYTABLE.B) > 100
) q
GROUP BY s
所以,回答:不,他们不一样。其中一个甚至没有效。