【问题标题】:Update query: subquery returned more than 1 value更新查询:子查询返回超过 1 个值
【发布时间】:2015-01-08 07:33:33
【问题描述】:

我正在尝试使用从另一个表 (incomestatement) 中提取的信息更新表 (Yahoostockdata)),具体取决于日期。

Yahoostockdata 包含雅虎每天的价格,我想根据incomestatement 中针对该特定日期的最实际可用信息添加每个日期的股票数量。

运行查询时(没有更新),我得到了我想要的所有数字。除了,添加UPDATE 语句时,我收到错误消息:suquery 返回超过 1 个值

消息 512,第 16 级,状态 1,第 1 行 子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。声明已终止。

谁能帮我解决这个问题?我已经看过相关的问题,但找不到答案。先感谢您。在我正在使用的代码下方:

Update YahooStockData
Set NumberOfShares = (Select [Weighted average shares outstanding (Diluted)]
   from (Select *,ROW_NUMBER() over (partition by derived_1.MorningstarTicker,
             derived_1.[date] order by derived_1.AsOfDate desc) as RN
         from (Select Yahoostockdata.YahooTicker, IncomeStatement.MorningstarTicker,
               yahoostockdata.[Date], AsOfDate, 
               Incomestatement.[Weighted average shares outstanding (Diluted)]
               from IncomeStatement INNER JOIN
                  YahooStockData ON IncomeStatement.MorningstarTicker = YahooStockData.MorningstarTicker
         Where  YahooStockData.[Date] >= AsOfDate) as derived_1) as derived_2
    Where RN = 1)

【问题讨论】:

  • 您对“子查询返回超过 1 个值”有什么不明白的地方吗?子查询返回多行。您可以通过在select 中使用top 1 或使用诸如min()max() 之类的聚合函数来天真地解决此问题。但是,您可能希望对实际选择的值进行一些控制。
  • 戈登,感谢您的快速回复。 Top 1 等确实不能解决它。基本上,该查询为我提供了应粘贴到 yahoostockdata 表中的所有行的精确副本。如果我能解决这个问题,我将不胜感激。

标签: sql sql-server tsql


【解决方案1】:

这可以进一步清理,但我相信这就是你所追求的:

;WITH cte AS (Select MorningstarTicker,[Weighted average shares outstanding (Diluted)]
                from (Select *,ROW_NUMBER() over (partition by derived_1.MorningstarTicker,
                             derived_1.[date] order by derived_1.AsOfDate desc) as RN
                      from (Select Yahoostockdata.YahooTicker, IncomeStatement.MorningstarTicker,
                                    yahoostockdata.[Date], AsOfDate, 
                                    Incomestatement.[Weighted average shares outstanding (Diluted)]
                            from IncomeStatement 
                            INNER JOIN   YahooStockData ON IncomeStatement.MorningstarTicker = YahooStockData.MorningstarTicker
                            Where  YahooStockData.[Date] >= AsOfDate
                            ) as derived_1
                    ) as derived_2
                Where RN = 1)
                )
UPDATE a
SET a.NumberofShares = b.[Weighted average shares outstanding (Diluted)]
FROM YahooStockData a
JOIN cte b
  ON a.MorningstarTicker = b.MorningstarTicker

我已将 MorningstartTicker 添加到您的子查询中,并将整个位放入 cte 中,以使带有 JOINUPDATE 更易于查看。

原始查询的问题在于您试图用一个值更新每条记录,因为它们与子查询无关。

【讨论】:

  • 效果很好,谢谢。我只需要添加另一个连接列(即 A.date = B.date)。不幸的是,查询运行速度很慢,因此欢迎任何有关如何使其更快的想法。我现在在日期和股票代码上添加了一个集群键。一般来说,CTE 的工作速度是否比 Pradeep 建议的更快?
  • 显然,我只能将 1 个答案标记为正确,尽管两者都有效。
  • @Xivan 我想执行计划是相同的,我只是认为 cte 更容易通过连接结构查看更新。
【解决方案2】:

试试这个

UPDATE A
SET    NumberOfShares = B.[Weighted average shares outstanding (Diluted)]
FROM   YahooStockData A
       JOIN (SELECT [Weighted average shares outstanding (Diluted)],
                    derived_2.MorningstarTicker
             FROM   (SELECT *,
                            Row_number() OVER ( partition BY  derived_1.MorningstarTicker, derived_1.[date]
                                ORDER BY derived_1.AsOfDate DESC) AS RN
                     FROM   (SELECT Yahoostockdata.YahooTicker,
                                    IncomeStatement.MorningstarTicker,
                                    yahoostockdata.[Date],
                                    AsOfDate,
                                    Incomestatement.[Weighted average shares outstanding (Diluted)]
                             FROM   IncomeStatement
                                    INNER JOIN YahooStockData
                                            ON IncomeStatement.MorningstarTicker = YahooStockData.MorningstarTicker
                             WHERE  YahooStockData.[Date] >= AsOfDate) AS derived_1) AS derived_2
             WHERE  RN = 1) B
         ON A.MorningstarTicker = B.MorningstarTicker 

【讨论】:

  • 效果很好,谢谢。我只需要添加另一个连接列(即 A.date = B.date)。不幸的是,查询运行速度很慢,因此欢迎任何有关如何使其更快的想法。我现在在日期和股票代码上添加了一个集群键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多