可能重复:
SQL:HAVING和WHERE有什么区别?
我见过各种关于WHERE
和的讨论HAVING
.我仍然有一个问题:HAVING
仅在考虑聚合时使用,或者可以用于更一般的术语:每当您在查询中创建或别名字段时?我知道WHERE
应该尽可能使用.
我有一个viewX
基于一些表的连接的view():
当我使用时WHERE
,查询被延迟,处理器使用率达到50%,最后我需要关闭mysqld.exe
服务并重新启动以尝试再次解决问题.
当我使用时HAVING
,查询执行完美而快速,我得到结果,一切准备就绪.
该查询与此类似:
SELECT * FROM viewX WHERE column_of_view = 'foo'
SELECT * FROM viewX HAVING column_of_view = 'foo'
Run Code Online (Sandbox Code Playgroud)
怎么了?
我找到的解决方案是做这样的事情:
SELECT * FROM (SELECT * FROM viewX) as T WHERE column_of_view = 'foo'
SELECT * FROM (SELECT * FROM viewX) as T HAVING column_of_view = 'foo'
Run Code Online (Sandbox Code Playgroud)
两种查询工作都很精细,但我觉得这很糟糕!(SELECT*FROM(... viewX)????)
我无法找到解决Oracle缺乏对HAVING EVERY子句的支持的方法.
我有两个表,生产和电影,具有以下架构:
Production (pid, mid)
Movie(mid, director)
Run Code Online (Sandbox Code Playgroud)
其中'pid'是表示发布者ID的整数,'mid'是表示电影ID的整数,director是电影导演的名称.
我的目标是获得一份出版商名单(按ID),这些出版商只发行由Peter Jackson或Ben Affleck执导的电影.
为了实现这一点,我写了以下查询:
SELECT *
FROM Production P, Movie M
WHERE P.mid = M.mid;
GROUP BY P.pid
HAVING EVERY ( M.director IN ('Ben Affleck', 'Peter Jackson') );
Run Code Online (Sandbox Code Playgroud)
但由于Oracle不支持HAVING EVERY,所以我得到的是以下错误:
HAVING EVERY ( M.director IN ('ben affleck', 'PJ') )
*
ERROR at line 5:
ORA-00907: missing right parenthesis
Run Code Online (Sandbox Code Playgroud)
由于董事职位必须适用于出版商制作的每部电影,我不相信条件可以转移到WHERE子句.
这条路障有什么办法吗?任何被认为是"标准"的东西?另外(也许更重要的是)为什么Oracle选择不实施HAVING EVERY?
我们能够在SQL查询中使用HAVING子句来过滤行组.当我们使用GROUP BY子句时,它以这种方式直接工作.
但是,让我们看看这个查询:
select 1 where 1!=1 having count(*)=0;
Run Code Online (Sandbox Code Playgroud)
(或者为Oracle添加'from dual').
如果HAVING真的进行了组过滤,那么在WHERE之后我们没有任何行,所以我们没有任何组,结果必须是'No row selected'.
但是在PostgreSQL,MySQL和Oracle中,我们得到'1'作为查询的结果.
问题:HAVING如何真正起作用?
SQL小提琴测试:http://www.sqlfiddle.com/#!15/d5407/51
有人可以把这个英文翻译成SQL我已经尝试了几件但没有运气.
SELECT CASE FOR COUNT(person_id)> 3 THEN person_id end FROM table
我试图只在表中获得> 3次出现的person_id.
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
HAVING aggregate_function(column_name) operator value
Run Code Online (Sandbox Code Playgroud)
拥有和在哪里有什么区别
我有一个看似简单的问题,但我无法弄明白.
我有以下几点:
Name Zipcode
ER 5354
OL 1234
AS 1234
BH 3453
BH 3453
HZ 1234
Run Code Online (Sandbox Code Playgroud)
我想找到那些ID没有明确定义一行的行.
所以我想在这里看到:
OL 1234
AS 1234
HZ 1234
Run Code Online (Sandbox Code Playgroud)
或者只是简单的邮政编码.
对不起,我忘了提到一个重要的部分.如果名称相同则不是问题,只有同一个邮政编码有不同的名称. 所以这意味着:BH 3453不归
我一直以为我不能,但MSDN说不然.
不使用GROUP BY时,HAVING的行为类似于WHERE子句.
我检查过并得到错误:
消息8121:
列'...'在HAVING子句中无效,因为它不包含在聚合函数或GROUP BY中.
那么,它是什么?文档中的错误或鲜为人知的细节?
这可能是Sybase SQL Server中可用的功能之一.现在微软重写SQL Server更接近ANSI标准,但忘了修复文档.
是这样的吗?
有分组的例子- 在网上有计数或选择linq的最小日期,但我找不到我的问题的特定解决方案.而且我也没有先进的linq理解来结合我迄今为止发现的这些解决方案.
我有这样的SQL查询:
select client_id
from my_table /* Column1 : client_id, Column2 : _month */
group by client_id
having min(_month) = '2009-11'
Run Code Online (Sandbox Code Playgroud)
我的问题是:如何将此查询转换为c#linq?.到目前为止,我写了类似的东西,但它没有给出我必须拥有的东西:
var query = dataTable.AsEnumerable() // This is my_table
.GroupBy(c => c.Field<Int32>("client_id"))
.Select(g => new
{
g.Key,
minMonth = g.Min(c => c.Field<string>("_month"))
})
.Where(d => d.minMonth == "Some String like '2009-11'");
Run Code Online (Sandbox Code Playgroud)
它实际上给了我这个SQL的结果,我不需要:
select client_id, min(_month)
from my_table
where _month = '2009-11'
group by client_id
Run Code Online (Sandbox Code Playgroud)
注意:_month是一个格式为YYYY-MM的字符串.
我MigratoryBirds
在SQL Server表中的数据下面
birdType
1
4
4
4
5
5
5
3
Run Code Online (Sandbox Code Playgroud)
用于创建上表的SQL脚本:
/****** Object: Table [dbo].[migratoryBirds] Script Date: 20-Jul-17 8:01:02 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[migratoryBirds](
[birdType] [int] NULL
) ON [PRIMARY]
GO
Run Code Online (Sandbox Code Playgroud)
我的目标是获得表中频率最高的鸟类.如果我编写存储过程并可以自由编写多个SQL查询,那么这并不困难,但我正在尝试使用单个SQL查询来实现它.我试图看看Having
SQL服务器的子句是否对我有任何帮助.
所以我写的第一个查询是:
select birdType, count(1) AS [birdCount]
from migratorybirds
group by birdType
Run Code Online (Sandbox Code Playgroud)
它给出了以下输出
birdType birdCount
1 1
3 1
4 3
5 3
Run Code Online (Sandbox Code Playgroud)
由于这是一个聚合的情况,所以我认为Having
条款可以帮助我在这里筛选出频率最高的记录3
.birdType
4和5具有最高频率3.
所以,我增强了我的查询,如下所示:
select birdType, count(1) AS [birdCount] …
Run Code Online (Sandbox Code Playgroud) having-clause ×10
sql ×8
oracle ×3
having ×2
mysql ×2
sql-server ×2
where-clause ×2
c# ×1
database ×1
group-by ×1
linq ×1
postgresql ×1
select ×1
sqlplus ×1
t-sql ×1
where ×1