(T-SQL): 如何使用结果集A计算结果集B?

(T-SQL): How do I use result set A to calculate result set B?

我有 2 个查询,A 和 B,我目前彼此独立使用。它们都是 return 一个员工 ID 和一些指标值。我现在想在查询 B 中使用来自结果集 A 的员工 ID return。

A 的查询结构如下:

select employee_id from employee where employee_team = 1 and employee_role = 1

B 的查询结构如下:

declare @tester int = 123450 --plug in employee ID
select employee_id
,employee_name
,sum(case 
  when notes.note_author!=employee_id and logs.log_date<@today 
  then 1 else 0 end) as metric
from notes
inner join note_to_log_bridge as br on notes.note_id=br.note_id
inner join logs on br.log_id=logs.log_id
inner join employee on employee_id=@Tester

如果我想获得 B 的 5 名员工的指标,我必须 运行 查询 B 5 次,每次都更改 @Tester 变量。相反,我想找到一些自动化方法,以便我为结果集 A 中的每个 employee_id 获取查询 B 的指标。

我尝试将存储结果集 A 作为 CTE,并使用 while 循环 运行 通过查询 B:

declare @line=1
with cte (employee_id) as <query_a>
while (@line<=count(cte.employee_id))
begin <query b>...

我从未完成此查询,因为我发现 while 无法跟踪 CTE 的创建。

我尝试使用 table 变量:

declare @set_a (employee_id int)
insert into @set_a <query a>

但是当我尝试在查询 B 中使用 @set_a 时,我收到一条消息说我需要声明标量变量 @set_a。

我尝试使用临时 table 并收到 "could not be bound" 错误。

我没主意了。我是否正在以类似正确方向的任何方式解决这个问题?这可能吗?

谢谢!

使用Cursor ?

If I want to get B's metrics for 5 employees, I have to run query B 5 times, changing the @Tester variable each time.

DECLARE @empid int;
DECLARE vend_cursor CURSOR
    FOR select employee_id from employee where employee_team = 1 and employee_role = 1
OPEN vend_cursor
FETCH NEXT FROM vend_cursor into @empid;
WHILE @@FETCH_STATUS = 0    
BEGIN  
// your query with @mpid 
FETCH NEXT FROM db_cursor INTO @name   
END   
CLOSE vend_cursor
DEALLOCATE vend_cursor

是的,您可以使用光标,它会很好地工作。

但是,如果您的行数明显超过 5 行,您可以考虑使用 CROSS APPLY 将其全部包含在一个查询中。它可能比游标工作得更快。

select
    employee.employee_id
    ,CA.*
from
    employee
    CROSS APPLY
    (
        <put your query B here 
        and replace all references to parameter @Tester 
        with employee.employee_id>
    ) AS CA
where employee.employee_team = 1 and employee.employee_role = 1

您可以这样想这个运算符:对于主外部查询 A 中的每一行,CROSS APPLY 运行内部查询 B,并可能从外部查询 A 中引用该行的值(在此案例 employee.employee_id).