2017-04-16 50 views
6

在我的情況下,我有兩個表格Project和Activity,它們看起來像這樣。如何處理返回多個值的子查詢

Tables

項目是在頂部和活動底部的表。

在活動表中,activityID和projectID是主鍵。

我想實現的是創建一個View,它返回所有具有比ProjectProjectEndDate晚endDate的活動的項目。

總之我想這樣做:

SELECT * 
FROM Project 
WHERE (SELECT MAX(endDate) FROM Activity GROUP BY projectID) > projectedEndDate 

,但我得到了以下錯誤:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression. 

謝謝

+0

給它增加一個「LIMIT 1」? –

+0

@DavidHoelzer由於子查詢是按項目ID分組的,「限制1」不是OP所需要的,因爲他可能從錯誤的項目中獲得日期。 – dasblinkenlight

+0

另外,'LIMIT 1'是**不是**標準SQL。它只適用於MySql,並且這個問題被標記爲Sql Server。 –

回答

4

的問題是,每個項目的ID GROUP BY返回一行。

您需要調整您的查詢中使用的加盟:

SELECT p.* 
FROM Project p 
JOIN (
    SELECT projectID, MAX(endDate) as maxEnd 
    FROM Activity 
    GROUP BY projectID 
) a ON a.projectID = p.projectID 
WHERE a.maxEnd > projectedEndDate 

這將產生具有結束過去對本項目的結束日期的活動的所有項目。

+1

@toonice我修改了從子查詢中排除字段的答案。謝謝! – dasblinkenlight

+0

不客氣。 – toonice

+0

謝謝,它工作的很棒! –

5

你可以對你的查詢做一些微調。你只需要一個相關子查詢:

SELECT p.* 
FROM Project p 
WHERE (SELECT MAX(a.endDate) 
     FROM Activity a 
     WHERE a.projectId = p.projectId 
    ) > p.projectedEndDate 

換句話說,而不是GROUP BY,你需要相關條款。

+0

謝謝,它效果很好。 –

2

這裏是一個純粹的JOIN版本:

SELECT DISTINCT p.* 
FROM Project p 
JOIN Activity a on a.projectID = p.projectID 
AND a.endDate > p.projectedEndDate 

恕我直言,這是相當整潔。

+0

非常感謝你! –