在where子句和具有子句之间执行联合/或运算

时间:2016-12-14 05:29:03

标签: sql union where-clause having having-clause

我正在研究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 have avg(col3)> 30

最终结果= resultset1 + resultset2 在实施这种情况时,是否有任何人有更好的方法或想法?

假设我有以下过滤器组合

col1 = 23 要么 avg(col2)> 30 和 avg(col3)= 10 要么 avg(col1)< 10 和 col2 = 10

我需要在SQL

中显示满足这些条件的结果

2 个答案:

答案 0 :(得分:0)

目前还不清楚你对这个准SQL有什么要求。我想你需要选择两个条件col1= 'get'和/或? having avg(col3) >30。所以这是解决方案:

Select * from table 
 where (col1= 'get')
 OR 
 col2 in (SELECT col2 FROM table GROUP BY col2 HAVING avg(col3) >30) 

如果您需要两个条件均为true,则将OR替换为AND。

如果您只需要为col1 = 'get'计算AVG,请将此条件添加到子查询中:

Select * from table 
 where (col1= 'get')
 OR 
 col2 in (SELECT col2 FROM table WHERE (col1= 'get') 
                      GROUP BY col2 
                      HAVING avg(col3) >30) 

答案 1 :(得分:0)

SELECT <resultset1> --resultset based on a WHERE clause UNION SELECT <resultset2> --resultset based on HAVING

通常,如果您想要结果集的并集,请使用... UNION。

在条件中使用OR等同于UNION(因为UNION运算符是逻辑析取的等价关系代数),但它要求所涉及条件的范围相同。

在这种情况下,这是不可能的,因为HAVING条件不适用于SELECT中提到的表,而是适用于静默&#34;中的表。由GROUP子句创建。这是不可避免的,因为像AVG,SUM这样的东西只有在确定 必须使用哪组行 来计算AVG,SUM时才有意义。 ......结束了,这就是GROUP BY规范的作用。

修改

在SQL中,UNION有不同的风格,UNION DISTINCT和UNION ALL。一个消除重复,另一个赢了。如果您想要与OR完全相同的行为,那么您显然需要从结果集中消除重复的行为。