SQL使用WITH和JOIN一起高效地创建视图

SQL使用WITH和JOIN一起高效地创建视图,sql,sql-server,sql-server-express,Sql,Sql Server,Sql Server Express,我试图使用一个名为period的表中的数据,该表指定日期属于哪个时段,然后使用该实例使用以下语句连接到另一个表中 WITH rep_prod AS ( SELECT t.tran_num, t.amount, t.provider_id, t.clinic, t.tran_date, t.type, t.impacts, p.period_id, p.fiscal_year, p.period_weeks FROM transactions t, period p

我试图使用一个名为
period
的表中的数据,该表指定日期属于哪个时段,然后使用该实例使用以下语句连接到另一个表中

WITH rep_prod AS (
    SELECT t.tran_num, t.amount, t.provider_id, t.clinic, 
    t.tran_date, t.type, t.impacts, p.period_id, p.fiscal_year, p.period_weeks
    FROM transactions t, period p
    WHERE tran_date BETWEEN period_start AND period_end
)

SELECT r.tran_num, r.amount, r.provider_id, d.first_name, d.last_name, 
d.clinic, r.tran_date, r.period_id, r.period_weeks, r.type, r.impacts
FROM rep_prod AS r
INNER JOIN provider AS d
ON r.provider_id = d.provider_id AND r.clinic = d.clinic
希望在我的数据库上创建一个视图,有没有更有效的方法来实现这一点?目前,这一数字约为620万行,而且只会继续扩大。假设我使用的是内存有限的SQLExpress,仅此查询就需要7分钟才能完成

更新:更改查询以反映
SELECT DISTINCT
功能的删除

编辑:@Rabbit那么你是在建议这样的事情

SELECT t.tran_num, t.amount, t.provider_id, d.first_name, d.last_name, 
d.clinic, t.tran_date, p.period_id, p.period_weeks, p.fiscal_year, p.period_start, p.period_end, t.type, t.impacts
FROM transactions t
    INNER JOIN provider d
        ON provider.provider_id = transactions.provider_id AND provider.clinic = transactions.clinic
    INNER JOIN period p
        ON t.tran_date BETWEEN p.period_start AND p.period_end

prodids子查询似乎没有必要。为什么period表不能被区分呢?此外,CTE是不必要的。您可以只将事务连接到期间,而不使用CTE。您是否设置了正确的索引?我使用的是
SELECT DISTINCT
,因为我最初从具有句点0值的源表中提取出来的值没有任何意义。但我相信你是对的,这是不必要的。然而,我不认为我可以连接所有3个表,我的
period
表没有任何可以连接其他表的值,它纯粹是一个参考表,用于确定事务属于哪个期间。我同意@Rabbit,CTE似乎没有必要。而使用SQL Express索引只是您唯一的选择。您似乎可以通过t.provider=d.provider和t.clinic=d.clinic来实现这一点。我对您的转换日期和周期日期有点怀疑(这可能是您需要CTE的原因)周期id在任何其他表中是否为FK?@omaphyxiate您确实需要加入一些内容:周期开始和周期结束之间的转换日期