【发布时间】:2017-04-08 09:30:05
【问题描述】:
我仍在学习 SQL,我在想如何将行值传递给 cross apply 查询中的函数。
假设这是我的第一张桌子
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 开始和结束日期,始终从第一个表返回每个项目记录的所有周数。
我想知道,我该如何做到这一点,使用 first_tables start_date 和 end_date 值,以便我的交叉应用只返回包含在行开始/结束日期中的 week_intervals 的记录。
我将不胜感激有关此事的任何提示。
【问题讨论】:
-
您的
First_table包含什么内容以及您的预期结果是什么? -
请以第一张表中的数据和最终结果为例进行说明。
-
首先,感谢您写了一个经过深思熟虑和详细的问题。如果您正在学习 SQL,请接受一些建议:它不像编程那样为所有内容编写函数并调用该函数。您应该考虑做一个“基于集合”的解决方案。在这种情况下,这意味着创建一个包含所有可能值的日历表并加入它。当您使用函数时,它们在 100 行、1000 行、10,000 行中都可以正常工作,但最终随着行数的增加,性能会下降到最低点,而您不得不匆忙重写一些东西。
标签: sql sql-server