Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Inner функция возвращающая табл. значение  [new]
Kolu4ka
Member

Откуда:
Сообщений: 46
Всем привет.
Есть табличка
CREATE TABLE [dbo].[Works](
	[ID_work] [int] IDENTITY(1,1) NOT NULL,
	[Parent] [int] NOT NULL ,
	[WorkName] [varchar](max) NOT NULL)

В ней хранится древовидная структура работ.
Написала функцию, которая по id работы возвращает все родительские работы.

CREATE FUNCTION [dbo].[GetParentWork] (@idwork int)
RETURNS @works TABLE (ID_Work int)  
BEGIN 

WITH wks (ID_Work, Parent)
AS
(
    SELECT ID_work, Parent
    FROM dbo.Works
    WHERE ID_work=@idwork
    UNION ALL
    SELECT d.ID_Work, d.Parent
    FROM dbo.Works AS d
    INNER JOIN wks AS p ON p.Parent = d.ID_work
)

Insert Into @works
SELECT ID_work FROM wks

return
END

Все работает, но вот как ее использовать для нескольких работ не понимаю. Т.е. у меня есть выборка каких-то работ и мне нужно к каждой работе получить еще и родительские. Что-то типа такого
Select x.ID_Work
From UsedWokrs w
Inner Join [dbo].[GetParentWork](w.ID_work) x

Помогите пожалуйста!

PS
Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64)
Jun 17 2016 19:14:09
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 14393: )
24 ноя 17, 13:24    [20980814]     Ответить | Цитировать Сообщить модератору
 Re: Inner функция возвращающая табл. значение  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4535
Kolu4ka, outer apply
24 ноя 17, 13:26    [20980824]     Ответить | Цитировать Сообщить модератору
 Re: Inner функция возвращающая табл. значение  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Kolu4ka,

вообще CROSS APPLY, но правильнее просто сдельть VIEW
24 ноя 17, 13:27    [20980829]     Ответить | Цитировать Сообщить модератору
 Re: Inner функция возвращающая табл. значение  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30751
TaPaK
Kolu4ka,

вообще CROSS APPLY, но правильнее просто сдельть VIEW
Или переделать Функцию на INLINE
24 ноя 17, 13:35    [20980869]     Ответить | Цитировать Сообщить модератору
 Re: Inner функция возвращающая табл. значение  [new]
iap
Member

Откуда: Москва
Сообщений: 46952
Почему функция multistatement, а не inline? Там же внутри одна инструкция.
Это чтобы помедленнее было? Торопиться не надо! ©
24 ноя 17, 13:37    [20980882]     Ответить | Цитировать Сообщить модератору
 Re: Inner функция возвращающая табл. значение  [new]
Kolu4ka
Member

Откуда:
Сообщений: 46
Спасибо! Все получилось!
Outer или Cross в моем случае наверное не важен, т.к. работы обработаю через distinct.
24 ноя 17, 13:38    [20980884]     Ответить | Цитировать Сообщить модератору
 Re: Inner функция возвращающая табл. значение  [new]
Kolu4ka
Member

Откуда:
Сообщений: 46
alexeyvg, iap
Я честно копала в сторону Inline, но не смогла до конца понять как избавиться от insert.
24 ноя 17, 13:40    [20980891]     Ответить | Цитировать Сообщить модератору
 Re: Inner функция возвращающая табл. значение  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Kolu4ka
Спасибо! Все получилось!
Outer или Cross в моем случае наверное не важен, т.к. работы обработаю через distinct.

возвращайтесь как к нам с темой "Очень медленно работает"
24 ноя 17, 13:41    [20980894]     Ответить | Цитировать Сообщить модератору
 Re: Inner функция возвращающая табл. значение  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
Kolu4ka
alexeyvg, iap
Я честно копала в сторону Inline, но не смогла до конца понять как избавиться от insert.


WITH Works AS (
SELECT ID_work FROM wks) 
SELECT... 
24 ноя 17, 13:48    [20980927]     Ответить | Цитировать Сообщить модератору
 Re: Inner функция возвращающая табл. значение  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30751
Kolu4ka
alexeyvg, iap
Я честно копала в сторону Inline, но не смогла до конца понять как избавиться от insert.

CREATE FUNCTION [dbo].[GetParentWork] (@idwork int)
RETURNS TABLE
AS
RETURN (
    WITH wks (ID_Work, Parent)
    AS
    (
        SELECT ID_work, Parent
        FROM dbo.Works
        WHERE ID_work=@idwork
        UNION ALL
        SELECT d.ID_Work, d.Parent
        FROM dbo.Works AS d
        INNER JOIN wks AS p ON p.Parent = d.ID_work
    )
    SELECT ID_work FROM wks
)
24 ноя 17, 13:49    [20980936]     Ответить | Цитировать Сообщить модератору
 Re: Inner функция возвращающая табл. значение  [new]
Cammomile
Member

Откуда:
Сообщений: 1212
Как то так, ядумаю

CREATE FUNCTION [dbo].[GetParentWorkInline] (@idwork int)
RETURNS TABLE 
 
RETURN 
(
WITH wks (ID_Work, Parent)
AS
(
    SELECT ID_work, Parent
    FROM dbo.Works
    WHERE ID_work=@idwork
    UNION ALL
    SELECT d.ID_Work, d.Parent
    FROM dbo.Works AS d
    INNER JOIN wks AS p ON p.Parent = d.ID_work
)

SELECT ID_work FROM wks

 
 )
24 ноя 17, 13:51    [20980938]     Ответить | Цитировать Сообщить модератору
 Re: Inner функция возвращающая табл. значение  [new]
Kolu4ka
Member

Откуда:
Сообщений: 46
Всем спасибо за помощь!
24 ноя 17, 14:08    [20980999]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить