Tengo esta consulta para mostrar los datos que quiero. pero me da el error [Err] 21000 - [SQL Server] Subquery devolvió más de 1 valor. Esto no está permitido cuando la subconsulta sigue =,! =, <, <=,>,> = O cuando la subconsulta se usa como una expresión.

Datos: MCRX-MX023-LF-KGX, pero cuando ingreso los otros datos no hay error

Este es el servidor SQL 2008

SELECT
    *
FROM
    (
        SELECT
            SupplierID,
            CurrencyAP AS Currency,
            (
                SELECT
                    UnitPrice
                FROM
                    Ms_PartPriceSupplier
                WHERE
                    SupplierID = x.SupplierID
                AND PartID = x.PartID
                AND LastUpdateDate = x.Tgl
            ) AS Price,
            PartID,
            (
                SELECT
                    PartnerName
                FROM
                    Ms_Partner
                WHERE
                    PartnerID = x.SupplierID
            ) SupplierName
        FROM
            (
                SELECT
                    PartID,
                    SupplierID,
                    CurrencyAP,
                    MAX (LastUpdateDate) AS Tgl
                FROM
                    Ms_PartPriceSupplier
                WHERE
                    PartID = 'MCRX-MX023-LF-KGX'
                GROUP BY
                    PartID,
                    SupplierID,
                    CurrencyAP
            ) x
    ) y
UNION ALL
    SELECT
        PartnerID AS SupplierID,
        '' AS Currency,
        0 AS Price,
        '' AS PartID,
        PartnerName AS SupplierName
    FROM
        Ms_Partner
    WHERE
        PartnerID NOT IN (
            SELECT DISTINCT
                SupplierID
            FROM
                Ms_PartPriceSupplier
            WHERE
                PartID = 'MCRX-MX023-LF-KGX'
        )
0
Sandhi Zukhruf 10 may. 2019 a las 09:29

3 respuestas

La mejor respuesta

Las subconsultas SELECT para las columnas Price y / o SupplierName en su consulta devuelven múltiples valores. Deben devolver solo un valor único (por fila).

Puede proporcionar un TOP (1) en esas subconsultas o ajustar las condiciones en sus cláusulas WHERE / HAVING.

1
Bart Hofland 10 may. 2019 a las 06:38

Algunas de sus subconsultas devuelven más de 1 valor

            SELECT
                UnitPrice
            FROM
                Ms_PartPriceSupplier
            WHERE
                SupplierID = x.SupplierID
            AND PartID = x.PartID
            AND LastUpdateDate = x.Tgl

            SELECT
                PartnerName
            FROM
                Ms_Partner
            WHERE
                PartnerID = x.SupplierID

Agregue TOP (1) o alguna función de agregación como MIN, MAX en el dispositivo con sus requisitos, por ejemplo:

        SELECT TOP (1)
            UnitPrice
        FROM
            Ms_PartPriceSupplier
        WHERE
            SupplierID = x.SupplierID
        AND PartID = x.PartID
        AND LastUpdateDate = x.Tgl

        SELECT TOP (1)
            PartnerName
        FROM
            Ms_Partner
        WHERE
            PartnerID = x.SupplierID
0
Denis Rubashkin 10 may. 2019 a las 06:42

El mensaje de error es bastante claro. Cuando utiliza una subconsulta en lugar de no una tabla sino un valor, debe asegurarse de que solo se devuelve un valor, de lo contrario, recibirá este mensaje de error.

La investigación adicional de su consulta revela que usted ... lo está haciendo mal. Por ejemplo,

    (
        SELECT
            PartnerName
        FROM
            Ms_Partner
        WHERE
            PartnerID = x.SupplierID
    ) SupplierName

Parece que aquí desea obtener el nombre asociado con cada Id. De proveedor. No debe hacer subconsultas en la sección SELECT de esta manera. Recuerde: FROM se evalúa primero, luego WHERE, luego SELECT. Lo que realmente le indicó a la base de datos aquí es que intente devolver un solo valor como SupplierName: esto solo funcionará si su consulta solo tiene un SupplierID.

Tienes que empezar a pensar con uniones. Así es como debe escribir su consulta:

SELECT
    *
FROM
    (
        SELECT
            SupplierID,
            CurrencyAP AS Currency,
            Ms_PartPriceSupplier.UnitPrice AS Price,
            PartID,
            Ms_Partner.PartnerName as SupplierName
        FROM
            (
                SELECT
                    PartID,
                    SupplierID,
                    CurrencyAP,
                    MAX (LastUpdateDate) AS Tgl
                FROM
                    Ms_PartPriceSupplier
                WHERE
                    PartID = 'MCRX-MX023-LF-KGX'
                GROUP BY
                    PartID,
                    SupplierID,
                    CurrencyAP
            ) x
            inner join Ms_Partner on PartnerID = x.SupplierID
            inner join Ms_PartPriceSupplier on SupplierID = x.SupplierID AND PartID = x.PartID AND LastUpdateDate = x.Tgl
    ) y
UNION ALL
    SELECT
        PartnerID AS SupplierID,
        '' AS Currency,
        0 AS Price,
        '' AS PartID,
        PartnerName AS SupplierName
    FROM
        Ms_Partner
    WHERE
        PartnerID NOT IN (
            SELECT DISTINCT
                SupplierID
            FROM
                Ms_PartPriceSupplier
            WHERE
                PartID = 'MCRX-MX023-LF-KGX'
        )
0
Dale K 10 may. 2019 a las 06:53