我仍在学习 SQL,并且想知道如何将行值传递到交叉应用
查询中的函数中。
假设这是我的第一个表
SELECT
[Project], [emp_id],
[Allocation_start], [Allocation_end]
FROM
First_table
我有一个函数,它接受 2 个参数 - 开始日期和结束日期,并返回按周间隔分割的日期...
示例:
select * from [udf_GetIntervals]('2017-01-01','2017-01-30')
数据:
dt_start dt_end
----------------------
2016-12-26 2017-01-01
2017-01-02 2017-01-08
2017-01-09 2017-01-15
2017-01-16 2017-01-22
2017-01-23 2017-01-29
2017-01-30 2017-02-05
我所做的就是运行上述函数,日期从 7 月 1 日到 12 月 30 日,并将其存储在虚拟表中,然后对该表使用交叉应用。
select *
from [First_table]
cross apply
(select * from #temp) b
这有效,但它独立于 first_tables
开始和结束日期,始终返回第一个表中每 1 个项目记录的所有周数。
我想知道,我该如何使用first_tables start_date 和 end_date 值来执行此操作,以便我的交叉应用仅返回在行开始/结束日期中包含 week_intervals 的记录。
如果有任何关于此事的提示,我将不胜感激。
最佳答案
您可以使用APPLY
执行按行操作。 CROSS APPLY
的行为类似于 INNER JOIN
,而 OUTER APPLY
则更像 LEFT JOIN
。
表值函数返回一个表。您必须提供别名并将此结果集包含到您的列列表中:
SELECT [Project]
,[emp_id]
,[Allocation_start]
,[Allocation_end]
,WeekDates.*
From First_table
CROSS APPLY dbo.[udf_GetIntervals]([Allocation_start],[Allocation_end]) AS WeekDates
关于SQL Server : run function for each row based on the provided row value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40780274/