用于填充缺失值的SQL联接

用于填充缺失值的SQL联接,sql,sql-server,outer-join,cross-apply,Sql,Sql Server,Outer Join,Cross Apply,我有一个历史数据表(记录);在存储过程结束时,我需要根据日期表(dbo.MasterDates)填充数据。对于下面的简化示例,我将简单地使用City作为唯一数据系列的标识符 tempdb.dbo.#记录: 日期 城市 价值 2021-06-04 洛杉矶 10.5 2021-06-04 纽约市 11.2 2021-06-05 洛杉矶 9.2 2021-06-06 纽约市 8.1 创建一个包含所有可能的城市/日期组合的投影,然后连接到该投影: WITH Projection AS ( SEL

我有一个历史数据表(记录);在存储过程结束时,我需要根据日期表(
dbo.MasterDates
)填充数据。对于下面的简化示例,我将简单地使用City作为唯一数据系列的标识符

tempdb.dbo.#记录:

日期 城市 价值 2021-06-04 洛杉矶 10.5 2021-06-04 纽约市 11.2 2021-06-05 洛杉矶 9.2 2021-06-06 纽约市 8.1
创建一个包含所有可能的城市/日期组合的投影,然后连接到该投影:

WITH Projection AS (
    SELECT City, [Date]
    FROM Dates
    CROSS JOIN (SELECT DISTINCT City FROM Records) c
)
SELECT p.*, coalesce(r.[Value], 0.0) as [Value]
FROM Projection p
LEFT JOIN #Records r ON r.[Date] = p.[Date] AND r.City = p.City
ORDER BY [Date], City
请在此处查看它的工作情况:


如果您有一个Cities表,那么将
交叉连接到该表,然后将
左连接到您的
#记录
表可能会更有效
DISTINCT
可能是一个昂贵的运算符。@Larnu我想使示例尽可能简单;在实际用例中,我将字段的唯一组合存储在单独的临时表中。我会调查交叉连接,谢谢!