SQL Server错误:子查询返回多个值

问题描述:

我写了查询,但我得到这个错误:SQL Server错误:子查询返回多个值

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

这是我的查询:

SELECT 
    d.Description, 
    s.Version, 
    d.UtiPrefix, 
    d.UTI, 
    d.PrimaryAC, 
    s.ReportingObb, 
    s.ReportingObb, 
    d.LEI, 
    d.LEI_Countp, 
    d.LEI, 
    s.ReportingDeleg, 
    d.Curr, 
    c.Trade_Party_Domicile, 
    c.LEI_SGR, 
    Price = (
     SELECT Price 
     FROM Price p 
     WHERE p.DATE = '2014-09-15 00:00:00.000' 
     ) 
FROM 
    Derivatives AS d 
INNER JOIN 
    Settings AS s ON d.LEI_SGR = s.LEI_SGR 
INNER JOIN 
    Clients c ON d.LEI_SGR = c.LEI_SGR 
WHERE 
    c.LEI_SGR = '8156008BA0ABD6B3AE15' 
+0

您的子查询返回多个行。任何外键有价格然后加入,也在子查询 – Sathish 2014-09-25 14:14:33

+0

你的问题是什么?错误信息是不言自明的。 – 2014-09-25 14:17:38

+0

改为选择适当的单价。 – Randy 2014-09-25 14:18:21

这是因为你的子查询SELECT Price FROM Price p WHERE p.DATE = '2014-09-15 00:00:00.000'是返回多行。您的Price表对于2014-09-15有多个price

更新:我在另一个答案的评论中看到,您希望在结果中显示该日期的所有价格。您需要将price表加入您的查询。不要在SELECT子句中查询price表。

SELECT d.Description, 
    s.Version, 
    d.UtiPrefix, 
    d.UTI, 
    d.PrimaryAC, 
    s.ReportingObb, 
    s.ReportingObb, 
    d.LEI, 
    d.LEI_Countp, 
    d.LEI, 
    s.ReportingDeleg, 
    d.Curr, 
    c.Trade_Party_Domicile, 
    c.LEI_SGR, 
    p.Price 
FROM Derivatives AS d 
INNER JOIN Settings AS s 
    ON d.LEI_SGR = s.LEI_SGR 
INNER JOIN Clients c 
    ON d.LEI_SGR = c.LEI_SGR 
,price p 

WHERE c.LEI_SGR = '8156008BA0ABD6B3AE15' and p.date = '2014-09-15 00:00:00.000' 
+0

是的,我知道,但最新的解决方案是什么请 – user3826166 2014-09-25 14:18:32

+0

如果该日期的价格表中有多个记录,那么你需要决定哪个价格记录你想选择。 max(价格),avg(价格),TOP 1价格,删除该日期表中的所有其他价格。我无法告诉你如何选择正确的价格。 – JNevill 2014-09-25 14:24:11

+0

我已经添加了一个SQL语句到我的答案,将交叉加入价格到您的查询结果给你多个记录,每个价格'2014-09-15' – JNevill 2014-09-25 14:27:42

由于错误消息告诉你,你的子查询返回多个结果。您可以修复它这样:

对于MySQL:

SELECT Price 
FROM Price p 
WHERE p.DATE = '2014-09-15 00:00:00.000' 
LIMIT 1 

对于T-SQL:

SELECT TOP 1 Price 
FROM Price p 
WHERE p.DATE = '2014-09-15 00:00:00.000' 

希望这将帮助你

+0

我已经尝试与顶部(1),但感染我需要显示所有的价格根据该日期,所以我不能选择只有1 – user3826166 2014-09-25 14:23:04

+0

在这种情况下,您的问题是不是解决错误,但为了解决您的查询,以获得预期结果 – 2014-09-25 14:25:14

你需要从恢复力的子查询不止一行。

一种方法是使用MAX()

... 
Price = (
    SELECT MAX(Price) 
    FROM Price p 
    WHERE p.DATE = '2014-09-15 00:00:00.000' 
    ) 
... 

其他选项:

  • AVG()
  • MIN()
  • TOP 1/LIMIT 1(ETC取决于数据库)