当前位置: 首页 > 面试题库 >

有没有一种方法可以将SQL查询中的WHERE和HAVING子句进行OR运算?

樊浩初
2023-03-14
问题内容

假设我有一个SQL查询

SELECT Label1, Label2, SUM(number) as MySum
FROM MyTable
GROUP BY Label1, Label2

它给我一些结果,例如

Label1 | Label2 | MySum 
-------+--------+------
Foo    | Bar    |   100
Foo    | Baz    |  -100
NotFoo | Bar    |   100
NotFoo | Baz    |  -100

我可以放一个WHEREandHAVING子句来过滤结果

SELECT Label1, Label2, SUM(number) as MySum
FROM MyTable
WHERE Label1 = 'Foo'
GROUP BY Label1, Label2
HAVING MySum > 0

这给了我结果

Label1 | Label2 | MySum 
-------+--------+------
Foo    | Bar    |   100

WHEREHAVINGAND隐含一起编。

是否有类似的语法

SELECT Label1, Label2, SUM(number) as MySum
FROM MyTable
WHERE Label1 = 'Foo'
GROUP BY Label1, Label2
OR HAVING MySum > 0

给出结果

Label1 | Label2 | MySum 
-------+--------+------
Foo    | Bar    |   100
Foo    | Baz    |  -100
NotFoo | Bar    |   100

我可以做

SELECT Label1, Label2, SUM(number) as MySum
FROM MyTable
WHERE Label1 = 'Foo'
GROUP BY Label1, Label2

UNION

SELECT Label1, Label2, SUM(number)
FROM MyTable
GROUP BY Label1, Label2
HAVING MySum > 0

劣势: 这可能是低效率的,因为数据库必须计算Foo | Bar | 100两次该行,发现它是重复的,然后将其丢弃。

我也可以写

SELECT Label1, Label2, SUM(number) as MySum
FROM MyTable
WHERE Label1 = 'Foo'
GROUP BY Label1, Label2

UNION ALL

SELECT Label1, Label2, SUM(number)
FROM MyTable
WHERE Label1 <> 'Foo'
GROUP BY Label1, Label2
HAVING MySum > 0

缺点: 乍看之下,它开始变得不那么容易理解了(可能是最坏的缺点)。

或者

SELECT Label1, Label2, SUM(number) as MySum
FROM MyTable
GROUP BY Label1, Label2
HAVING MySum > 0
OR Label1 = 'Foo'

缺点: 这将使数据库可以做很多额外的工作,将大量的非Foo标签聚集在一起。


问题答案:

您的最后一个答案很好:

SELECT Label1, Label2, SUM(number) as MySum
FROM MyTable
GROUP BY Label1, Label2
HAVING MySum > 0
OR Label1 = 'Foo'

您已经说过这里还有很多工作要做,但事实并非如此,因为您必须进行汇总以找出是否MySum>0需要对非Label1='Foo'行进行确定。



 类似资料:
  • 问题内容: 我试图识别从Windows应用程序查看记录时发生的SQL插入。在SQL Profiler中,有一长串存储过程,当查看记录时会触发这些存储过程,但是,识别存储过程然后找到插入物,然后在对象浏览器中找到存储过程(即使带有过滤器)也非常麻烦。 有没有办法让我查看订单项上的所有SQL命令而不是存储过程?然后通过INSERT语句过滤? 感谢您的协助! 问题答案: 尝试观看事件SP:StmtSta

  • 我正在使用Jersey创建一个RESTful API,其中实现了一个ExceptionMapper类来捕获所有错误。 有没有办法从异常中获取查询字符串?或者实现PreparedStatement并在其中创建一个方法来获取查询字符串?

  • 问题内容: 我正在尝试使用一个简单的已提交字段在MySQL中获取记录。更准确地说,用户输入名称(名字或姓氏或全名),服务器应返回匹配的行。 到目前为止,我正在做的事情是这样的: 暂时可以正常工作,但是(显然)当用户提交全名时,该方法将无法正常工作。有没有办法在整个“ WHERE类型条件”和“ HAVING类型条件”之间添加OR?这样,我可以做类似的事情: 我知道我可以拆分原始字符串,但这会产生一些

  • 问题内容: 在处理大型数据库时,哪个性能更好,还是在SQL子句中? 它们的执行方式有什么不同吗? 问题答案: 我假设您想知道以下两者之间的性能差异: 根据MySQL手册,如果值是常数,则对列表进行排序,然后使用二进制搜索。我可以想象一下,它们以不特定的顺序进行逐一评估。因此在某些情况下速度更快。 最好的了解方法是使用特定数据在数据库中同时对它们进行概要分析,以查看哪种方法更快。 我在具有10000

  • 问题内容: 客户要求将Oracle DB SQL中的1行拆分为6行。 假设,最初的SQL(具有多个联接的复杂sql等)进入9列: 从X,Y,Z中选择A,B,C,D,E,F,G,H,I。。。(但查询非常复杂) 1)A,B,C,D,E,F,G,H,I 现在,客户要求返回返回到上述模式的每一行,新的输出应如下所示: 1)A,B,C,’D’,D 2)A,B,C,’E’,E 3)A, B,C,’F’,F 4

  • 问题内容: 我有一个.csv文件,如下所示: 我必须从文件中删除重复的电子邮件(整行)(即,上面示例中包含的行之一)。如何仅在字段1(用逗号分隔)上使用?根据,没有列选项。 我尝试了一些东西,但是没有用。 问题答案: 为了独特 所以逗号是定界符 对于关键字段1 测试结果: