首页 文章

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

提问于
浏览
0

我正在研究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 回答

  • 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)
    
  • 0

    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完全相同的行为,你显然需要一个消除其结果集重复的行为 .

相关问题