我有一个表值函数,它接受一个人的ID号并返回几行和一列。在另一个查询中,我正在创建一个SELECT,它可以检索有关很多人的大量信息。如何将我的主查询中的id号传递给我的函数来汇总列并将其加入我的主查询?我希望我没有表值函数,因为它可以很容易地工作,但是,这个函数在别处使用,我想重用它。也许这对于表值函数甚至不可能,我需要创建一个标量值。
我的主要查询如下:
select id_num, name, balance
from listOfPeople
表值函数如下所示:
calculatePersonalDiscount(id_number)
我想做点什么:
select id_num, name, balance
from listOfPeople
left join
(
SELECT id_num, SUM(discount)
FROM calculatePersonalDiscount(listOfPeople.id_num)
) x ON x.id_num = listOfPeople.id_num
但是你不能将listOfPeople.id_num传递给函数,因为它的范围并不相同。
答案 0 :(得分:43)
在SQL Server 2005中,您可以使用CROSS APPLY syntax:
select id_num, name, balance, SUM(x.discount)
from listOfPeople
cross apply dbo.calculatePersonalDiscount(listOfPeople.id_num) x
同样,还有一个OUTER APPLY语法,相当于LEFT OUTER join。
答案 1 :(得分:0)
我非常需要此功能,而您给了我一个开始,在这里,我可以加入另一个View。 (另一个表也可以),并且我在WHERE子句中包含了另一个函数。
SELECT CL_ID, CL_LastName, x.USE_Inits
FROM [dbo].[tblClient]
JOIN dbo.vw_InsuranceAppAndProviders ON dbo.vw_InsuranceAppAndProviders.IAS_CL_ID = tblClient.CL_ID
CROSS APPLY dbo.ufx_HELPER_Client_CaseWorker(tblClient.CL_ID) x
WHERE dbo.vw_InsuranceAppAndProviders.IAS_CL_ID = tblClient.CL_ID
AND dbo.ufx_Client_IsActive_By_CLID(tblClient.CL_ID) = 1
AND (dbo.vw_InsuranceAppAndProviders.IAS_InsuranceType = 'Medicare')
答案 2 :(得分:0)
我找不到任何证明,但是似乎您可以正常加入函数,就像使用表或视图那样。我在SQL Server 2017上尝试过它,但不知道还有哪些其他版本支持它:
CREATE FUNCTION dbo.test_join_func
(
@param INT
)
RETURNS TABLE
AS
RETURN (
SELECT * FROM sys.tables);
GO
CREATE TABLE dbo.test_join_tbl
(
a INT
);
GO
INSERT INTO dbo.test_join_tbl (a) VALUES (1);
GO
SELECT *
FROM dbo.test_join_tbl AS tjt
-- using any join condition just to test it is working
JOIN dbo.test_join_func(123) AS tjf ON tjf.object_id > 0;
DROP TABLE IF EXISTS dbo.test_join_tbl;
DROP FUNCTION IF EXISTS dbo.test_join_func;