我在存储过程中有一个查询,它必须列出一个范围内的所有日期,并从表中加入日期(如果当天存在的话)。
这个过程是在我成为DBA之前创建的,所以我想我可以优化一下。但是,我似乎碰到了一堵砖墙,我不明白为什么。
过程的当前实现从两个普通表(我们称它们为 TableA 和 TableB)中作为派生查询(在 FROM 子句中)中选择数据,然后将其作为 RIGHT JOIN 放在上面:
RIGHT JOIN (
SELECT DATEADD(DAY,number,@DateFrom) AS DATE
FROM (
SELECT DISTINCT number
FROM master.dbo.spt_values
WHERE name IS NULL
) n
WHERE DATEADD(DAY,number,@DateFrom) <= @DateTo
) AS y ON derived.Date = y.Date -- "derived" is an alias of the derived query
Run Code Online (Sandbox Code Playgroud)
由于在多个过程中使用了相同的代码,我想我会创建一个日期从 2005-01-01 到 2039-01-01 的表:
CREATE TABLE Dates(
[Date] DATE NOT NULL PRIMARY KEY
)
Run Code Online (Sandbox Code Playgroud)
该表是从具有日期维度的仓库中填充的。
所以,我写的不是那个 RIGHT JOIN,而是:
FROM Dates d
LEFT JOIN derived ON derived.Date …Run Code Online (Sandbox Code Playgroud)