2017-03-02 5 views
0

Wenn ich die folgende Abfrage ausführen:Dies ist nicht zulässig, wenn die Unterabfrage folgt =, = <, <= , >,> =, wenn ich subquery

SELECT 
    CASE 
     WHEN AT_EMPSCHEDULE.START1 <> '01/01/1900' 
      AND AT_EMPSCHEDULE.START2 <> '01/01/1900' 
      AND AT_EMPSCHEDULE.END2 <> '01/01/1900' 
      AND AT_EMPSCHEDULE.LEAVECODE ='' 
      AND NOT EXISTS(SELECT PDATE 
          FROM HR_PUBHOLIDAY 
          WHERE PDATE=AT_EMPSCHEDULE.TRANDATE) 
      AND DATEPART(WEEKDAY,AT_EMPSCHEDULE.TRANDATE) <> 1 
      THEN 
      CAST((SELECT HIS_GENSALARYD.BASESALARY/HIS_GENSALARYD.WORKDAY 
        FROM HIS_GENSALARYD 
        WHERE (AT_EMPSCHEDULE.TRANDATE BETWEEN HIS_GENSALARYD.PAYFROM 
                AND HIS_GENSALARYD.PAYTO 
        AND HIS_GENSALARYD.EMPCODE = AT_EMPSCHEDULE.EMPCODE)) AS DECIMAL(10, 2)) 
      ELSE 0 
    END AS DAILYSALARY 
FROM 
    HIS_GENSALARY 
INNER JOIN 
    AT_EMPSCHEDULE ON HIS_GENSALARY.EMPCODE = AT_EMPSCHEDULE.EMPCODE 
        AND MONTH(TRANDATE) = HIS_GENSALARY.INMONTH 
        AND YEAR(TRANDATE) = HIS_GENSALARY.INYEAR 
WHERE 
    HIS_GENSALARY.EMPCODE = HIS_GENSALARY.EMPCODE 

ich die Meldung:

Subquery hat mehr als 1 Wert zurückgegeben. Dies ist nicht zulässig, wenn die Unterabfrage folgt =,! =, <, < =,>,> = oder wenn die Unterabfrage als Ausdruck verwendet wird.

+2

In dem Kontext, in dem es verwendet wird, kann die Unterabfrage höchstens eine Zeile zurückgeben. SQL Server erwartet einen Skalarwert. Ein einzelner Wert. Keine Ergebnismenge. Das beobachtete Verhalten wird erwartet und entspricht dem dokumentierten Verhalten. Gab es eine * Frage *? Vielleicht möchten Sie einen einzelnen Wert zurückgeben, indem Sie beispielsweise eine Aggregatfunktion wie AVG verwenden? Wir raten nur. – spencer7593

Antwort

0

Das Problem ist hier:

(SELECT HIS_GENSALARYD.BASESALARY/HIS_GENSALARYD.WORKDAY 
FROM HIS_GENSALARYD 
WHERE AT_EMPSCHEDULE.TRANDATE BETWEEN HIS_GENSALARYD.PAYFROM 
    AND HIS_GENSALARYD.PAYTO 
AND HIS_GENSALARYD.EMPCODE = AT_EMPSCHEDULE.EMPCODE) 

, dass Sie als Ausdruck verwendet haben. Nach der Fehlermeldung, es muss nur jemals produzieren ein Ergebnis, wo Sie es verwendet haben; dh es darf nie mehr als eine Zeile zurückgeben, aber mindestens ein Aufruf hat mehrere Zeilen zurückgegeben.

Um zu erzwingen, dass immer nur eine Zeile zurückgegeben wird, wenden Sie eine Aggregatfunktion an; eine offensichtliche Wahl ist max():

(SELECT MAX(HIS_GENSALARYD.BASESALARY/HIS_GENSALARYD.WORKDAY) 
FROM HIS_GENSALARYD 
WHERE AT_EMPSCHEDULE.TRANDATE BETWEEN HIS_GENSALARYD.PAYFROM 
    AND HIS_GENSALARYD.PAYTO 
AND HIS_GENSALARYD.EMPCODE = AT_EMPSCHEDULE.EMPCODE) 
Verwandte Themen