2016-05-10 106 views
0

我不確定標題是否對應於我的問題,但這是我能描述它的最好方法。SQL - HAVING與遞歸語句

我想知道是否有理論上可以在having子句中使用遞歸語句進行查詢。例如:

SELECT a_name 
    FROM (
    SELECT Author.id as a_id, Author.name as a_name, COUNT (*) as science_fiction_per_author 
    FROM Title, Author, Title_tags, Tags, Publication_authors, Publication, Publication_content 
    WHERE ... 
    GROUP BY a_id 
    HAVING science_fiction_per_author = MAX(science_fiction_per_author) 
); 
+0

這是不可能的。你可以用'COUNT(*)'替換左邊的'science_fiction_per_author',但是你不能把它放在像MAX(COUNT(*))'這樣的另一個聚合函數中。 –

+1

你正在使用哪個DBMS –

+0

另外,你應該避免使用[舊式'JOIN'語法](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick -using-old-style-joins.aspx) –

回答

0

這不是真正的遞歸,但是您可以使用相同的短語兩次來找到具有最高計數的個體。這是在http://sqlzoo.net/wiki/More_JOIN_operations

短語

SELECT actor.name,count(movieid) moviesPerActor 
    FROM actor join casting ON actor.id=actorid 
    GROUP BY actor.name 

列出每個演員的名字和製作的電影的一些基於電影數據庫。

相同的短語使用兩次。 A版本用於查找單個演員製作的電影的最高數量,B版本用於識別該演員。

SELECT B.name from 
(SELECT MAX(moviesPerActor) as highestNumberOfMovies 
FROM(
    SELECT actor.name,count(movieid) moviesPerActor 
    FROM actor join casting ON actor.id=actorid 
    GROUP BY actor.name 
) as A) as A1 
JOIN 
(
    SELECT actor.name,count(movieid) moviesPerActor 
    FROM actor join casting ON actor.id=actorid 
    GROUP BY actor.name 
) as B 
ON B.moviesPerActor = highestNumberOfMovies 

在SQL的某些版本(包括MSSQL和Oracle),您可以使用窗口函數與最高值更高效地識別的元素。