(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
).
我有 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
).