Sql server 在TSQL中嵌套CTE表达式
我有一个TSQL递归CTE,它生成两个日期之间的日期范围,如下所示:Sql server 在TSQL中嵌套CTE表达式,sql-server,tsql,Sql Server,Tsql,我有一个TSQL递归CTE,它生成两个日期之间的日期范围,如下所示: Select Cast('2020-05-01' As DATETIME) 'DATE' Union All Select DateAdd(dd, 1, t.DATE) From DATE_RANGE t Where DateAdd(dd, 1, t.DATE) <= '2020-05-02' 然后我在另一个表达式和第二个表PEOPLE_RECORDS中使用它: With DAT
Select
Cast('2020-05-01' As DATETIME) 'DATE'
Union All
Select
DateAdd(dd, 1, t.DATE)
From
DATE_RANGE t
Where
DateAdd(dd, 1, t.DATE) <= '2020-05-02'
然后我在另一个表达式和第二个表PEOPLE_RECORDS中使用它:
With
DATE_RANGE As (
Select
Cast('2020-05-01' As DATETIME) 'DATE'
Union All
Select
DateAdd(dd, 1, t.DATE)
From
DATE_RANGE t
Where
DateAdd(dd, 1, t.DATE) <= '2020-05-02'
)
Select
*
From
DATE_RANGE,
PEOPLE
我故意不链接这两个表,因为我需要这两个日期,或者在我选择的范围内有多少个日期记录,以便为我的PEOPLE表中的每个记录复制
因此,如果我在PEOPLE中有20条记录,并且日期范围为2天,那么我希望这个查询中有40条记录。这也行得通,只是想它可能有助于提供一些关于我正在努力实现的目标的背景信息:
接下来,我希望能够将其打包到一个子查询中,并通过左外部联接链接到第三个联系人表,这样我就可以为递归CTE范围内的每个日期的每个人员记录计算第三个联系人表中存在的记录数。左边的外部连接是这样,我仍然可以看到没有联系人记录的日期
我尝试过用查询和SELECT查询将整个内容嵌套在另一个查询中,但我知道,通过查看有关堆栈溢出的其他帖子是无法做到这一点的
我不知道的是如何得到我需要的东西。希望这能解释我想要实现的目标,如果让人困惑的话,请道歉。我也知道,可能有一种完全不同的方法来获得我想要的东西,所以请随时提出替代方案。需要记住的一点是,我使用只读权限进行查询,无法创建函数或过程来执行此操作。听起来您需要一个TVF,然后可以加入。考虑这一点:
CREATE FUNCTION getPeopleDates(
@dtStart datetime,
@dtEnd datetime
)
RETURNS TABLE
AS
RETURN
With
DATE_RANGE As (
Select
@dtStart 'DATE'
Union All
Select
DateAdd(dd, 1, t.DATE)
From
DATE_RANGE t
Where
DateAdd(dd, 1, t.DATE) <= @dtEnd
)
Select
*
From
DATE_RANGE
CROSS JOIN People
类似于JMabee所说的,但是没有函数。像这样的东西行吗
With
DATE_RANGE As (
Select
Cast('2020-05-01' As DATETIME) 'DATE'
Union All
Select
DateAdd(dd, 1, t.DATE)
From
DATE_RANGE t
Where
DateAdd(dd, 1, t.DATE) <= '2020-05-02'
)
, people_and_dates as (
Select
*
From
DATE_RANGE,
PEOPLE
)
select *
from people_and_dates
-- do other stuff here
你能分享一下你的尝试吗?这样我们就能更好地理解你的意图了?您可以为日期和人员查询创建CTE。那有帮助吗,日期和人作为选择*从日期范围,人你错了。为你的交叉连接定义一个CTE,请使用现代语法,这样每个人都知道这是有意的,然后最终将这个新的CTE加入到你的联系信息中。谢谢你的快速回答。但是,我很确定用户的权限不允许他们创建自己的函数或过程,所以我希望以某种方式在Select查询中完成这一切。是的!感谢nickfinity,它工作得非常好!感谢大家的关注/回答:
SELECT t2.*
FROM getPeopleDates('5/1/20', '5/2/20') t1
LEFT JOIN SomeTable t2 on t1.PersonID = t2.PersonID
WHERE t2.PersonID IS NULL
With
DATE_RANGE As (
Select
Cast('2020-05-01' As DATETIME) 'DATE'
Union All
Select
DateAdd(dd, 1, t.DATE)
From
DATE_RANGE t
Where
DateAdd(dd, 1, t.DATE) <= '2020-05-02'
)
, people_and_dates as (
Select
*
From
DATE_RANGE,
PEOPLE
)
select *
from people_and_dates
-- do other stuff here