2017-04-16 2 views
6

In meinem Fall habe ich 2 Tabellen Projekt und Aktivität und sie sehen so aus.Wie mit Unterabfrage umzugehen, die mehr als 1 Wert zurückgibt

Tables

Projekt ist der Tisch an der Spitze und Aktivität an der Unterseite.

In der Aktivitätstabelle sind activityID und projectID Primärschlüssel.

Was ich versuche zu erreichen, ist eine View zu erstellen, die alle Projekte zurückgibt, die über Aktivitäten verfügen, deren Enddatum später als das Project projectedEndDate ist.

Zusammenfassend möchte ich dies tun:

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

Aber ich erhalte den folgenden Fehler:

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

Danke

+0

Fügen Sie ein 'LIMIT 1' hinzu? –

+0

@DavidHoelzer Da die Unterabfrage nach der Projekt-ID gruppiert ist, ist "Limit 1" nicht das, was OP benötigt, da er möglicherweise Daten von einem falschen Projekt erhält. – dasblinkenlight

+0

"LIMIT 1" ist auch ** nicht ** Standard-SQL. Es funktioniert nur auf MySql, und diese Frage ist mit Sql Server markiert. –

Antwort

4

Das Problem ist, dass GROUP BY gibt eine Zeile pro Projekt ID .

Sie benötigen eine Abfrage restrukturieren verwenden beitreten:

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 

Dadurch werden alle Projekte produzieren, die eine Aktivität haben, vorbei am Enddatum des Projekts endet.

+1

@toonice Ich änderte die Antwort, um Felder von der Unterabfrage auszuschließen. Vielen Dank! – dasblinkenlight

+0

Gern geschehen. – toonice

+0

Danke, es funktioniert super! –

5

Sie können tun, was Sie wollen, mit einer kleinen Optimierung Ihrer Abfrage. Sie brauchen nur eine korrelierte Unterabfrage:

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

Mit anderen Worten, statt GROUP BY, müssen Sie eine Korrelationsklausel.

+0

Danke, es funktioniert super. –

2

Hier ist eine reine Version JOIN:

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

IMHO ist es recht sauber und ordentlich.

+0

Es funktioniert super danke! –

Verwandte Themen