2017-04-16 27 views
6

W moim przypadku mam 2 tabele projektu i działania i wyglądają tak.Jak radzić sobie z podkwerendą zwracającą więcej niż 1 wartość

Tables

Projekt jest w tabeli u góry i na aktywność w stosunku do dna.

W tabeli działań activityID i projectID są kluczami głównymi.

Co staram się osiągnąć, to utworzyć widok, który zwraca wszystkie projekty, które mają działania, które mają datę zakończenia później niż projekt przewidywał datę.

Podsumowując chcę, aby to zrobić:

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

Ale pojawia się następujący błąd:

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

dziękuję

+0

Dodać do niego "LIMIT 1"? –

+0

@DavidHoelzer Ponieważ podzapytanie jest pogrupowane na identyfikatorze projektu, 'limit 1' nie jest tym, czego potrzebuje OP, ponieważ może otrzymywać dane z niewłaściwego projektu. – dasblinkenlight

+0

Również 'LIMIT 1' jest ** nie ** standardowym SQL. Działa tylko na MySql, a to pytanie jest oznaczony Sql Server. –

Odpowiedz

4

Problemem jest to, że GROUP BY powraca jeden wiersz na ID projektu .

trzeba zrestrukturyzować zapytanie do korzystania dołączyć:

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 

To będzie produkować wszystkie projekty, które wykazują aktywność kończącą obok daty zakończenia projektu.

+1

@toonice I zmodyfikowałem odpowiedź, aby wykluczyć pola z podzapytania. Dzięki! – dasblinkenlight

+0

Nie ma za co. – toonice

+0

Dziękuję, działa świetnie! –

5

Możesz zrobić, co chcesz, nieznacznie poprawiając zapytanie. Wystarczy podzapytanie skorelowane:

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

Innymi słowy, zamiast GROUP BY trzeba klauzulę korelacji.

+0

Dziękuję, działa świetnie. –

2

Oto czysta DOŁĄCZ wersję:

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

IMHO jest to całkiem schludny i uporządkowany.

+0

Działa świetnie, dziękuję! –