2014-03-27 87 views
0

我創建了一個包含電影和演員等。其中信息的數據庫,我創建了這些表:的SQL Server:select語句錯誤

CREATE TABLE Movie 
(
    Movie_ID PRIMARY KEY NOT NULL idenity(1,1), 
    Movie_title varchar(50), 
    .... 
) 

CREATE TABLE Actor 
(
    Actor_ID PRIMARY KEY NOT NULL identity(1,1), 
    Actor_Name varchar(50), 
    Actor_Surname varchar(50), 
    .....  
) 

,我使用下表將它們鏈接:

CREATE TABLE Has_Actor 
(
    Has_Actor_ID PRIMARY KEY NOT NULL identity(1,1), 
    Has_Actor_M_ID foreign key references Movie(Movie_ID), 
    Has_Actor_A_ID foreign key references Actor(Actor_ID), 
) 

現在我想查看的演員是誰在大多數電影,姓名發揮,所以我嘗試了下面的select語句:

SELECT 
    Actor.Actor_Name, Actor.Actor_Surname 
FROM 
    Actor, Has_Actor 
WHERE 
    Has_Actor_A_ID = Actor.Actor_ID 
    AND Actor.Actor_ID = (SELECT MAX(distinct COUNT(Has_Actor.Actor_ID))) 

當我執行此我得到這個錯誤:

Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

我知道有一個錯誤的地步,我使用maxcount功能,但我不明白什麼是錯的。你能幫我麼?

+1

[不良習慣踢:使用舊式聯接(http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad -habits-to-kick-using-old-style-joins.aspx) - 舊式*逗號分隔的表*樣式列表已停用ANSI - ** 92 ** SQL標準(大於** 20 ) –

+0

在這個子查詢中你沒有提到表名SELECT MAX(distinct COUNT(Has_Actor.Actor_ID)) –

回答

2

MAX(distinct COUNT)。 。 。那是一個奇怪的結構。聚合函數不會嵌套。

你都清楚地學習SQL,所以我固定的查詢,這樣你就可以學會做到以下幾點:

  1. 始終使用顯式join語法。切勿在from子句中使用逗號。
  2. 使用表別名(縮寫)使查詢更具可讀性。
  3. 將它們用於所有列引用。

這是您需要的查詢。它聚集由演員,訂單減少電影數量,並據法權產頂值:

SELECT TOP 1 a.Actor_Name, a.Actor_Surname 
FROM Actor a join 
    Has_Actor ha 
    on ha.Has_Actor_A_ID = a.Actor_ID 
GROUP BY a.Actor_Name, a.Actor_Surname 
ORDER BY COUNT(*) desc 

編輯:

如果你希望所有的演員(這是問題的曖昧),那麼你可以使用WITH TIES選項TOP(如哈姆雷特的評論中所建議的)。否則,你表達一個使用CTE查詢:

WITH ActorCounts as (
     SELECT a.Actor_Name, a.Actor_Surname, COUNT(*) as NumMovies 
     FROM Actor a join 
      Has_Actor ha 
      on ha.Has_Actor_A_ID = a.Actor_ID 
     GROUP BY a.Actor_Name, a.Actor_Surname 
    ) 
SELECT Actor_Name, Actor_Surname 
FROM ActorCounts ac 
WHERE NumMovies = (SELECT MAX(NumMovies) FROM ActorCounts); 
+1

'TOP 1 WITH TIES'就是。 –

+0

嘗試過。有用。非常感謝! – Vivian

0

試試這個

SELECT Actor.Actor_Name, Actor.Actor_Surname 
FROM Actor, 
    (
    SELECT TOP 1 Actor_ID,COUNT(Actor_ID) as counting from Has_Actor 
    Group by Actor_ID order by COUNT(Actor_ID) DESC 
    ) 
Has_Actor 
WHERE Has_Actor_A_ID=Actor.Actor_ID 
+0

試過這個,得到以下錯誤: in select top 1 and in by by statements:多部分標識符'Actor_ID'不能被綁定。 在兩個計數函數中:無效列名'Actor_ID' 其中語句:無效列名Has_Actor_A_ID – Vivian

+0

我編輯了代碼。請參考 – Madhivanan