我有2个查询,A和B,我目前彼此独立使用。它们都返回员工ID和一些度量值。我现在想要使用从查询B中的结果集A返回的员工ID。
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
如果我想获得5名员工的B指标,我必须运行查询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的创建。
我尝试使用表变量:
declare @set_a (employee_id int)
insert into @set_a <query a>
但是当我尝试在查询B中使用@set_a
时,我收到一条消息,说我需要声明标量变量@set_a。
我尝试使用临时表并得到“无法绑定”错误。
我没有想法。我是否在任何类似正确方向的问题上处理这个问题?这甚至可能吗?
谢谢!
答案 0 :(得分:1)
是的,你可以使用光标,它可以很好地工作。
但是,如果您有超过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
你可以这样考虑这个运算符:对于主外部查询中的每一行,CROSS APPLY
运行内部查询B,可以引用外部查询A中的行的值(在这种情况下{ {1}})。
答案 1 :(得分:0)
使用Cursor?
如果我想获得5名员工的B指标,我必须运行查询B 5 次,每次更改@Tester变量。
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