2017-09-19 3 views
0

ich die folgende SQL:Unterabfrage hat mehr als 1 Wert zurückgegeben. Dies ist nicht zulässig, wenn die Unterabfrage als Ausdruck verwendet wird.

SELECT 
    cusip, 
    symbol, 
    CASE WHEN (U1 = 0 OR U2 = 0 OR U3 = 0) 
       THEN 0 END Universe_Flag, 
    CASE WHEN (S1 = 'STOP' OR S2 = 'STOP' OR S3 = 'STOP') 
       THEN 'STOP' 
     WHEN (S1 = 'ACTIVE' OR S2 = 'ACTIVE' OR S3 = 'ACTIVE') 
       THEN 'ACTIVE' `enter code here` 
    END Status 

FROM (
    SELECT 
     b.cusip, 
     b.symbol, 
     (SELECT UNIVERSE FROM sec_master m WHERE m.CUSIP = b.cusip) U1, 
     (SELECT UNIVERSE FROM sec_master m WHERE m.SEDOL = b.cusip) U2, 
     (SELECT UNIVERSE FROM sec_master m WHERE m.CINS = b.cusip) U3, 
     (SELECT SEC_STATUS FROM sec_master m WHERE m.CUSIP = b.cusip) S1, 
     (SELECT SEC_STATUS FROM sec_master m WHERE m.SEDOL = b.cusip) S2, 
     (SELECT SEC_STATUS FROM sec_master m WHERE m.CINS = b.cusip) S3 
    FROM (
     SELECT 
      e.cusip, 
      e.symbol 
     FROM benchmark e 
     WHERE e.date > DATEADD(month, DATEDIFF(month,0,GETDATE()), 0) 
    ) b 

    LEFT JOIN sec_master x1 
     ON x1.CUSIP = b.cusip 
      AND x1.SEC_STATUS = 'ACTIVE' 
      AND x1.UNIVERSE = 1 

    LEFT JOIN sec_master x2 
     ON x2.SEDOL = b.cusip 
      AND x2.SEC_STATUS = 'ACTIVE' 
      AND x2.UNIVERSE = 1 

    LEFT JOIN sec_master x3 
     ON x3.CINS = b.cusip 
      AND x3.SEC_STATUS = 'ACTIVE' 
      AND x3.UNIVERSE = 1 

    WHERE x1.SEC_ID IS NULL 
     AND x2.SEC_ID IS NULL 
     AND x3.SEC_ID IS NULL 
) X 

Aber geben die folgende Fehlermeldung:

Msg 512, Level 16, State 1, Line 69 Subquery returned more than 1 value. This is not permitted when the subquery follows = , != , < , <= , >> , >= or when the subquery is used as an expression.

+0

Meine Vermutung ist, dass Ihre Unterabfragen auf der 'sec_master' Tabelle der cuprit sind. Übrigens, verwenden Sie MySQL oder SQL Server? –

+0

Sie sollten stattdessen alle diese unangenehmen Unterabfragen verwenden. –

Antwort

0

Einer Ihrer SELECT ... FROM sec_master m WHERE ... Rückkehr mehr als eine Zeile. Sie können TOP(1) mit ORDER BY Klausel verwenden oder Prädikate in WHERE Klausel ändern, um nur eine Zeile zu erhalten.

+0

Woher wissen Sie, dass die Logik sogar korrekt ist, wenn mehr als ein Datensatz zurückgegeben wird? –

+0

@TimBiegeleisen, Sie haben Recht, in den meisten Fällen gibt es Fehler –

+0

@RuslanK., Danke! Es behebt das Syntaxproblem, aber wir müssen es noch ändern, da es ein potentielles Datenproblem verbergen kann. –

Verwandte Themen