在where子句和有子句之间执行联合/或操作



我正在为SQL的实现做法,该SQL应显示在哪里和有子句之间的联合操作的结果。例如,

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语句的目的是返回满足条件和有条件的结果集。

可以说,我有一个table1,其中有Col1,Col2,Col3,Col4和大量数据。现在,有一个用例,当使用特定的crtieria col1 ='y',avg(col2)> 10,avg(col3*col4)= 30中的特定crtieria col1 ='y'选择过滤器时,用户希望看到结果。现在,我必须创建一个标准,以便我应该返回满足col1 ='y'或avg(col2)> 10或avg(col3*col4)= 30的所有结果,但是在这里,我们既有子句又有子句 -

Like, the below query

resultset1< = select *从table1中的col1 ='get';resultset2< = Select *从table1组中的COL2,具有AVG(COL3)> 30

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

可以说我的过滤器组合如下

col1 = 23或者AVG(COL2)> 30和AVG(COL3)= 10或者AVG(COL1)< 10和col2 = 10

我需要在SQL

中显示满足这些标准的结果

目前尚不清楚您想要从此准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) 

如果您需要两个条件,则可以替换或替换。

如果您只需要计算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) 

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

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

使用或处于条件等同于联合(因为联合操作员是关系代数等于逻辑分离),但是它要求涉及条件的范围相同。

在这种情况下,这是不可能的,因为有条件不适用于选择中提到的表,而是适用于组子句"默默地"的中间表。不可避免地是因为诸如AVG,总和之类的东西,仅当它也被确定时才有意义...结束,这就是按规范组成的。

编辑

在SQL中,联盟具有不同的风味,联盟独特和联合所有。一个消除了重复项,另一个不会。如果您想要与或完全相同的行为,显然您需要从其结果集中消除重复项的行为。

最新更新