我正在研究SQL的实现,它应该在Where和Having Clause之间显示Union操作的结果 . 例如,
Select * from table where col1= 'get' group by col2 (OR/UNION) having avg(col3) >30 . This is not valid but trying to give use a case
sql语句的目的是返回满足where和having条件的结果集 .
假设我有一个table1,表中包含col1,col2,col3,col4和大数据 . 现在,有一个用例,当用户在过滤器列表中选择具有特定crtieria col1 ='Y',avg(col2)> 10,avg(col3 * col4)= 30的过滤器时,想要查看结果 . 现在,我必须创建一个标准,这样,我应该返回满足col1 ='Y'或avg(col2)> 10 OR avg(col3 * col4)= 30的所有结果,就像我们在带有OR运算符的where子句中一样但这里我们有where子句和having子句 -
Like, the below query
resultset1 <= select * from table1,其中col1 ='get'; resultset2 <= select * from table1 group by col2,avg(col3)> 30
final result = resultset1 resultset2在实现这样的场景时,是否有任何人有更好的方法或想法?
假设我有以下过滤器组合
col1 = 23 OR avg(col2)> 30 AND avg(col3)= 10 OR avg(col1)<10 AND col2 = 10
我需要在SQL中显示满足这些条件的结果
2 回答
目前还不清楚你对这个准SQL有什么要求 . 我猜你需要选择两个条件的记录
col1= 'get'
和/或?having avg(col3) >30
. 所以这是解决方案:如果您需要两个条件均为true,则将OR替换为AND .
如果您只需要为
col1 = 'get'
计算AVG,那么将此条件添加到子查询中:SELECT <resultset1> --resultset based on a WHERE clause UNION SELECT <resultset2> --resultset based on HAVING
通常,如果您想要结果集的并集,请使用... UNION .
在条件中使用OR等同于UNION(因为UNION运算符是逻辑析取的等价关系代数),但它要求所涉及条件的范围相同 .
在这种情况下,这是不可能的,因为HAVING条件不适用于SELECT中提到的表,而是适用于GROUP子句创建的"silently"的中间表 . 这是不可避免的,因为像AVG,SUM这样的东西只有在确定 which set of rows 必须用于计算AVG,SUM,......时才有意义,这就是GROUP BY规范所做的 .
编辑
在SQL中,UNION有不同的风格,UNION DISTINCT和UNION ALL . 一个可以消除重复,另一个则不会 . 如果你想要与OR完全相同的行为,你显然需要一个消除其结果集重复的行为 .