Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 子查询返回了多个值。如何修复它?_Sql Server - Fatal编程技术网

Sql server 子查询返回了多个值。如何修复它?

Sql server 子查询返回了多个值。如何修复它?,sql-server,Sql Server,我有这个查询来显示我想要的数据。但它给了我错误[Err]21000-[SQL Server]子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时 数据:MCRX-MX023-LF-KGX,但当我输入其他数据时,没有错误 这是Sql server 2008 SELECT * FROM ( SELECT SupplierID, CurrencyAP AS Currency, (

我有这个查询来显示我想要的数据。但它给了我错误[Err]21000-[SQL Server]子查询返回的值超过1。当子查询在=、!=、=或者当子查询用作表达式时

数据:MCRX-MX023-LF-KGX,但当我输入其他数据时,没有错误

这是Sql server 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'
        )

查询中
价格
和/或
供应商名称
列的选择子查询将返回多个值。它们应该只返回一个值(每行)


您可以在这些子查询中提供TOP(1),也可以调整它们的WHERE/HAVING子句中的条件。

您的一些子查询返回的值超过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

错误信息非常清楚。当您使用子查询而不是表而是值时,必须确保只返回一个值,否则将收到此错误消息

对您的查询的进一步调查显示您。。。你做错了。比如说,

    (
        SELECT
            PartnerName
        FROM
            Ms_Partner
        WHERE
            PartnerID = x.SupplierID
    ) SupplierName
在这里,您似乎希望获得与每个供应商ID关联的名称。在
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'
        )