Я пытаюсь обновить таблицу (Yahoostockdata)
информацией, извлеченной из другой таблицы (incomestatement
), в зависимости от даты.
Yahoostockdata
содержит цены Yahoo за день, и я хотел бы добавить количество акций на дату в зависимости от самой актуальной информации, доступной в incomestatement
для этой конкретной даты.
При выполнении запроса (без обновления) я получаю все нужные числа. За исключением того, что при добавлении оператора UPDATE
я получаю сообщение об ошибке: suquery вернул более одного значения .
Сообщение 512, уровень 16, состояние 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)
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
Это можно было бы очистить дальше, но я считаю, что это то, что вам нужно:
;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, чтобы упростить просмотр UPDATE
с JOIN
.
Проблема с вашим исходным запросом заключается в том, что вы пытались обновить каждую запись одним значением, потому что они не были связаны с подзапросом.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.
top 1
вselect
или используя функцию агрегации, такую какmin()
илиmax()
. Однако вам может понадобиться некоторый контроль над тем, какое значение фактически выбрано.