我有三个表格的例子
Master_ID | Name
----------------
1 | John
2 | Max
3 | Liza
Activ_ID | Activity_Name | Master_ID
-------------------------------
1 | Swimming | 1
2 | Football | 1
3 | PlayStation | 1
4 | Boxing | 2
Balance_ID| Balance | Master_ID
-------------------------------
1 | 2000 | 1
2 | 3000 | 1
3 | 1500 | 1
4 | 2500 | 2
我有一个名为(fn_calc_balance_for_user)的函数,用于对第三个表(余额)进行一些计算,并使用First Table中的一些参数Bathed throw查询。
我有sql查询从Master_Table + Activites_Table和Balances_Table渲染数据:
select dbo.Master_Table.Master_ID,
dbo.Master_Table.Name,
Activites_Table.Activity_Name ,
(select dbo.fn_calc_balance_for_user(dbo.Master_Table.Master_ID) as EXP1) as Total_Balance
From dbo.Master_Table INNER JOIN dbo.Activites_Table
ON
dbo.Master_Table.Master_ID = dbo.Activites_Table.Master_ID
Master_ID | Name | Activity_Name | Total_Balance
------------------------------------------------
1 | John | Swimming | 6500
1 | John | Football | 6500
1 | John | PlayStation | 6500
1 | Max | Boxing | 2500
作为这一点,每一件事都有效但注意功能callecd(fn_calc_balance_for_user) 将在该查询的每一行上调用,并且函数只是例如,真正的函数进行更复杂的计算,并且它对于执行该操作的性能不利 我的水晶报告将显示结果:
_______________________________________________________________
ID : (1)
Name : (John)
Balance : (6500)
Activities :
--------------------
- Swimming
- Football
- PlayStation
_______________________________________________________________
ID : (2)
Name : (Max)
Balance : (2500)
Activities :
--------------------
- Boxing
______________________________________________________________
我的问题是: - 如何为每个Master_ID调用一次(fn_calc_balance_for_user),而不是在所有行上调用 我的意思是,当你看到结果时,你会注意到john记录为3行,并且该函数上的每一行称为i只需要为每个用户提供,例如john,max等...执行一次该函数而不是每行都保存性能,有人告诉我你必须使用分组,我可以使用它,但在我的水晶报告中使用Master_ID进行分组,但在原始的sql上如何定位数据而不是每次我们都重复调用(fn_calc_balance_for_user)在activites_table上排一行
这是讨论男孩......
感谢每个人。答案 0 :(得分:0)
试试这个:
select dbo.Master_Table.Master_ID,
dbo.Master_Table.Name,
Activites_Table.Activity_Name ,
t.Total_Balance
From dbo.Master_Table INNER JOIN dbo.Activites_Table
ON
dbo.Master_Table.Master_ID = dbo.Activites_Table.Master_ID
inner join (select Master_ID,
fn_calc_balance_for_user(t.Master_ID) as Total_Balance
from (select distinct Master_ID
from Master_Table)t)t
on t.Master_ID = dbo.Activites_Table.Master_ID;
目标是找到唯一的Master_ID,并为每个人调用fn_calc_balance_for_user一次。 可以使用上面的单独查询轻松实现。