Я пытаюсь заполнить созданную мной таблицу фундаментальными данными, представленными в другой таблице.
У меня есть несколько идентификаторов, к которым можно присоединиться, но по ряду причин ни один идентификатор не будет работать для всех записей. В связи с этим я установил серию каскадных операторов UPDATE: сначала выполняется внутреннее соединение с использованием ID1 для основной таблицы и заполнение таблицы для имеющихся записей; затем внутреннее соединение, используя ID2, к основной таблице для записей, которые ранее не заполнялись, и снова заполнение таблицы для записей с совпадением; и т.д.
Это позволяет мне получить совпадение для почти всех записей, присутствующих в моей исходной таблице (~ 99,5% имеют совпадение после каскадных обновлений, где не более 78% имеют совпадение с любым отдельным идентификатором), что отлично. Проблема в том, что мне нужно сделать это, чтобы заполнить несколько различных полей в моей таблице, и обработка становится вялой, когда я повторяю процедуру для каждого элемента данных.
Есть ли лучший способ достичь моей цели, чем использовать каскадные обновления? Возможно, что-то похожее на функцию COALESCE, о которой я просто не знаю (COALESCE не будет работать, но что-то похожее итеративное по своей природе)?
Если нет, то в приведенном ниже запросе есть ли какой-нибудь очевидный способ ускорить это?
UPDATE #temp
SET Avg_DivYld_5yr = d.value_ / AvgPrice
FROM #temp b
JOIN qai.dbo.secmstr s ON s.cusip = substring(b.cusip,1,8)
--on s.sedol = substring(b.sedolcode,1,6)
AND b.Avg_DivYld_5yr IS NULL
JOIN qai.dbo.secmap m ON m.seccode = s.seccode
AND m.ventype = 7
AND ((m.exchange = 0 AND m.rank = 1) OR m.exchange = 2)
JOIN qai.dbo.wsndata d ON d.code = m.vencode
AND d.item = 5140
--and d.freq = 'A'
AND d.year_ = @year_
JOIN (SELECT code, SUM(value_) AS AvgPrice
FROM qai.dbo.wsndata d2
WHERE year_ BETWEEN @year_-4 and @year_
AND item = 5001
AND freq = 'A'
GROUP BY code) d2 ON d2.code = m.vencode