首页 > 解决方案 > 这里有没有在 SQL 查询中使用交叉连接的替代方法?

问题描述

我有两个表Person_GapsMissingDates我需要在其中生成一个新表Output,该表是所有行与人员 ID 以及MissingDates根据它们在Person_Gaps. 表格示例如下:

Person_Gaps

PersonId  StartDate   EndDate
1         2011-01-01  2011-04-01
1         2014-12-31  2015-05-03
2         2011-01-01  2011-02-01
3         2015-01-01  2015-05-03
.
.

缺失日期

DateVal
2011-01-01
2011-01-02
2011-01-03
.
.
.
2016-01-03

所需输出表

PersonID DateVal
1        2011-01-01   
1        2011-01-02
.        .
.        .
2        2011-01-01
2        2011-01-02
3        2015-01-01
3        2015-01-02
.        .
.        .
3        2015-05-03

我可以使用以下SELECT语句获得当前想要的输出,CROSS JOIN但我想知道是否有更好的方法可以在没有 T-SQL 中的交叉连接的情况下执行此操作。也许以某种方式使用 BETWEEN 或日期范围。

SELECT p.PersonID, md.DateVal
FROM Person p
CROSS JOIN MissingDates md
WHERE md.DateVal >= p.StartDate AND md.DateVal <= p.EndDate

标签: sqlsql-servertsql

解决方案


你的查询没问题。它可以用一个来写JOIN

SELECT p.PersonID, md.DateVal
FROM Person p JOIN
     MissingDates md
     ON md.DateVal >= p.StartDate AND md.DateVal <= p.EndDate;

你的结果表明你想要平等。

注意:以上将生成与您的查询相同的执行计划。它摆脱了CROSS JOIN,但这可能不会影响性能。


推荐阅读