2016-04-01 236 views
0

我有下面的SQL查询的问题:嵌套SQL查询

SELECT job 
FROM (SELECT job, COUNT(*) AS cnt 
FROM Employee 
GROUP BY job) 
WHERE cnt=1 

至于结果它应该只显示了CNT(岗位数)等于1
当我上面的测试选择查询所有作业小提琴,我得到以下错误:

Incorrect syntax near the keyword 'WHERE'. 

SQLFiddle:http://sqlfiddle.com/#!6/d812a/7

+0

http://sqlfiddle.com/#!6/d812a/15 – Strawberry

+0

Baker和Gardener的预期结果是什么? – Loufylouf

+0

您也可以使用HAVING,这将使外部查询冗余 – Strawberry

回答

1

无需使用子查询的复杂性增加时,它不要求

SELECT job, count(job) 
FROM Employee 
GROUP BY job 
having count(job)=1; 
+0

谢谢 - 看起来很简单。 :) – CallMeBronxy

0

您忘记添加别名。 请更改查询这样

SELECT job 
FROM (SELECT job, COUNT(*) AS cnt 
FROM Employee 
GROUP BY job) As MyTable 
WHERE cnt=1 

你应该为内部查询给别名当您使用select和where子句之外。

+0

不知道。感谢您提到它 - 但我想我会使用HAVING-Clausel。 – CallMeBronxy

+0

这是一个很好的,它是不同于你问。我更正了你的查询。如果它有效,如果它是直接回答你的问题,然后upvote和接受。检查已问过的问题,而不是替代解决方案的权利? –

+0

你说得对,当我有足够的声望点的时候,我会赞成。 – CallMeBronxy

0

您应该使用它是那种事做了HAVING条款。您的要求将会更加简单:

SELECT job FROM Employee GROUP BY job 
HAVING COUNT(id)=1 

的文档指出

SQL标准要求具有必须引用仅列 GROUP BY子句或聚合函数中使用的列。但是, MySQL支持此行为的扩展,并允许HAVING到 将SELECT列表中的列和外部子查询中的列作为 。

要注意的重要的事情是违背WHERE条款,你可以使用集合funcitons(如计数,最大值,最小值......)的HAVING子句。

1

您需要提供别名到嵌套查询

SELECT A.job 
FROM (SELECT job, COUNT(*) AS cnt 
FROM Employee 
GROUP BY job)A 
WHERE A.cnt=1 
0

您应该使用HAVING语法:

SELECT job, COUNT(*) AS cnt 
FROM Employee 
GROUP BY job 
HAVING cnt = 1; 
+0

不起作用,它会返回一个错误。聚合函数应该直接用在'HAVING'子句中。 – Loufylouf

+0

这取决于你的SQL模式。如果你禁用了'ONLY_FULL_GROUP_BY',它应该可以工作。 –