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