Подтвердить что ты не робот

Присоединение функции значения таблицы к запросу 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 в функцию, так как она не является той же областью.

4b9b3361

Ответ 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')