Подзапрос вернул более 1 значения.Как это исправить? - PullRequest
0 голосов
/ 10 мая 2019

У меня есть этот запрос, чтобы показать данные, которые я хочу.но это дает мне ошибку [Err] 21000 - [SQL Server] Подзапрос возвратил более 1 значения.Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

data: MCRX-MX023-LF-KGX, но когдаЯ ввожу другие данные, там нет ошибки

это сервер 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'
        )

Ответы [ 3 ]

1 голос
/ 10 мая 2019

Подзапросы SELECT для столбцов Price и / или SupplierName в вашем запросе возвращают несколько значений.Они должны возвращать только одно значение (на строку).

Вы можете либо указать TOP (1) в этих подзапросах, либо изменить условия в их предложениях WHERE / HAVING.

0 голосов
/ 10 мая 2019

Сообщение об ошибке совершенно ясно.Когда вы используете подзапрос вместо не таблицы, а значения, вы должны убедиться, что возвращается только одно значение, иначе вы получите это сообщение об ошибке.

Дальнейшее изучение вашего запроса показывает, что вы ...делаем это неправильно.Например,

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

Кажется, здесь вы хотите получить имя, связанное с каждым SupplierID.Вы не должны делать подзапросы в разделе SELECT таким образом.Помните: сначала оценивается FROM, затем WHERE, затем SELECT.Что вы на самом деле указали этой базе данных, так это попытайтесь вернуть ЕДИНОЕ значение как SupplierName: это будет работать, только если ваш запрос имеет только один SupplierID.

Вам нужно начать думать с объединениями.Вот как вы должны написать свой запрос:

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 голосов
/ 10 мая 2019

Некоторые из ваших подзапросов возвращают более 1 значения

            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

Добавьте TOP (1) или какую-либо функцию агрегирования, например MIN, MAX, в соответствии с вашими требованиями, например:

        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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...