Присоединение функции значения таблицы к запросу MSSQL
У меня есть функция table-value, которая принимает идентификационный номер человека и возвращает несколько строк и столбцов. В другом запросе я создаю SELECT, который извлекает много информации о многих людях. Как я могу передать номер id из моего основного запроса в свою функцию, чтобы суммировать столбец и присоединиться к его основному запросу? Мне жаль, что у меня не было функции значения таблицы, так как это будет работать легко, однако эта функция используется в другом месте, и я бы хотел ее повторно использовать. Возможно, это невозможно даже с помощью функции table-value, и мне нужно создать скалярную.
Мой основной запрос выглядит следующим образом:
select id_num, name, balance
from listOfPeople
И функция table-value выглядит так:
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 в функцию, так как она не является той же областью.
Ответы
Ответ 1
В SQL Server 2005 вы можете использовать синтаксис CROSS APPLY:
select id_num, name, balance, SUM(x.discount)
from listOfPeople
cross apply dbo.calculatePersonalDiscount(listOfPeople.id_num) x
Также существует синтаксис OUTER APPLY для эквивалента объединения LEFT OUTER.
Ответ 2
Мне это очень нужно, и вы дали мне начало, и здесь я смог присоединиться к другому мнению. (другая таблица тоже будет работать), и я включил другую функцию в предложение 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')