Присоединение функции табличного значения к запросу MSSQL - PullRequest
25 голосов
/ 31 марта 2009

У меня есть функция табличного значения, которая принимает идентификационный номер человека и возвращает несколько строк и столбцов. В другом запросе я создаю SELECT, который извлекает много информации о многих людях. Как я могу передать идентификационный номер из моего основного запроса в мою функцию, чтобы суммировать столбец и присоединить его к моему основному запросу? Хотелось бы, чтобы у меня не было функции табличного значения, так как это работало бы легко, однако, эта функция используется в другом месте, и я хотел бы использовать ее повторно Возможно, это даже невозможно с табличной функцией, и мне нужно создать скалярную функцию.

Мой основной запрос выглядит так:

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 в функцию, поскольку это не совсем та же область.

Ответы [ 2 ]

43 голосов
/ 31 марта 2009

В 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.

0 голосов
/ 23 января 2019

Мне это очень нужно, и вы дали мне старт, и здесь я смог ПРИСОЕДИНИТЬСЯ к другому Виду. (другая таблица тоже будет работать), и я включил другую функцию в предложение 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...