Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 В чем сила CROSS APPLY ?  [new]
ЗадумчивыйПассажир
Guest
Доброго времени суток. В чем смысл этого соединения по сравнению либо с подзапросом в поле если для одного поля.
Либо для соединения если полей несколько.
Может кто то привести примеры где он объективно удобен ?
Спасибо.
31 окт 13, 13:46    [15058437]     Ответить | Цитировать Сообщить модератору
 Re: В чем сила CROSS APPLY ?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
Пример из HELP по APPLY
CREATE TABLE Employees
(
    empid   int         NOT NULL
    ,mgrid   int         NULL
    ,empname varchar(25) NOT NULL
    ,salary  money       NOT NULL
    CONSTRAINT PK_Employees PRIMARY KEY(empid)
);
GO
INSERT INTO Employees VALUES(1 , NULL, 'Nancy'   , $10000.00);
INSERT INTO Employees VALUES(2 , 1   , 'Andrew'  , $5000.00);
INSERT INTO Employees VALUES(3 , 1   , 'Janet'   , $5000.00);
INSERT INTO Employees VALUES(4 , 1   , 'Margaret', $5000.00);
INSERT INTO Employees VALUES(5 , 2   , 'Steven'  , $2500.00);
INSERT INTO Employees VALUES(6 , 2   , 'Michael' , $2500.00);
INSERT INTO Employees VALUES(7 , 3   , 'Robert'  , $2500.00);
INSERT INTO Employees VALUES(8 , 3   , 'Laura'   , $2500.00);
INSERT INTO Employees VALUES(9 , 3   , 'Ann'     , $2500.00);
INSERT INTO Employees VALUES(10, 4   , 'Ina'     , $2500.00);
INSERT INTO Employees VALUES(11, 7   , 'David'   , $2000.00);
INSERT INTO Employees VALUES(12, 7   , 'Ron'     , $2000.00);
INSERT INTO Employees VALUES(13, 7   , 'Dan'     , $2000.00);
INSERT INTO Employees VALUES(14, 11  , 'James'   , $1500.00);
GO
--Create Departments table and insert values.
CREATE TABLE Departments
(
    deptid    INT NOT NULL PRIMARY KEY
    ,deptname  VARCHAR(25) NOT NULL
    ,deptmgrid INT NULL REFERENCES Employees
);
GO
INSERT INTO Departments VALUES(1, 'HR',           2);
INSERT INTO Departments VALUES(2, 'Marketing',    7);
INSERT INTO Departments VALUES(3, 'Finance',      8);
INSERT INTO Departments VALUES(4, 'R&D',          9);
INSERT INTO Departments VALUES(5, 'Training',     4);
INSERT INTO Departments VALUES(6, 'Gardening', NULL);
 
GO
CREATE FUNCTION dbo.fn_getsubtree(@empid AS INT) 
    RETURNS @TREE TABLE
(
    empid   INT NOT NULL
    ,empname VARCHAR(25) NOT NULL
    ,mgrid   INT NULL
    ,lvl     INT NOT NULL
)
AS
BEGIN
  WITH Employees_Subtree(empid, empname, mgrid, lvl)
  AS
  ( 
    -- Anchor Member (AM)
    SELECT empid, empname, mgrid, 0
    FROM Employees
    WHERE empid = @empid

    UNION all
    
    -- Recursive Member (RM)
    SELECT e.empid, e.empname, e.mgrid, es.lvl+1
    FROM Employees AS e
      JOIN Employees_Subtree AS es
        ON e.mgrid = es.empid
  )
  INSERT INTO @TREE
    SELECT * FROM Employees_Subtree;

  RETURN
END
GO
 
SELECT D.deptid, D.deptname, D.deptmgrid
    ,ST.empid, ST.empname, ST.mgrid
FROM Departments AS D
    CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST;
31 окт 13, 13:54    [15058533]     Ответить | Цитировать Сообщить модератору
 Re: В чем сила CROSS APPLY ?  [new]
ЗадумчивыйПассажир
Guest
Да видел я этот пример. Есть что нибудь так на пальцах чтобы понятно было зачем он так нужен.
Или для простых ситуаций в нем смысла нет ?
31 окт 13, 13:56    [15058562]     Ответить | Цитировать Сообщить модератору
 Re: В чем сила CROSS APPLY ?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
ЗадумчивыйПассажир
Да видел я этот пример. Есть что нибудь так на пальцах чтобы понятно было зачем он так нужен.
Вот за этим:
CREATE FUNCTION dbo.fn_getsubtree(@empid AS INT) 
...
    CROSS APPLY fn_getsubtree(D.deptmgrid) AS ST;

ЗадумчивыйПассажир
Или для простых ситуаций в нем смысла нет ?
Все можно посчитать на счетах. В копмьютере, получается, смысла нет?
31 окт 13, 13:59    [15058592]     Ответить | Цитировать Сообщить модератору
 Re: В чем сила CROSS APPLY ?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
Не парьтесь.Обычно под задачу ищут метод решения а не наоборот.
Когда у Вас появится реальная задача которая может быть решена с помощью CROSS APPLY тогда вы и поймёте зачем он нужен.
31 окт 13, 14:00    [15058593]     Ответить | Цитировать Сообщить модератору
 Re: В чем сила CROSS APPLY ?  [new]
ЗадумчивыйПассажир
Guest
Возможно я неправильно сформулировал вопрос.
Использование данного соединения не для функций, а для подзапросов.
Касается упражнений на известном sql-ex.ru.

2LexusR Есть подозрения что для конкретной задачи я просто не понимаю как им пользоваться :)

Я бы опубликовал задачу но это противоречит правилам вышеуказанного сайта.
31 окт 13, 14:10    [15058685]     Ответить | Цитировать Сообщить модератору
 Re: В чем сила CROSS APPLY ?  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
CROSS APPLY позволяет инкапсулировать в функцию обработку любой сложности значений колонок строки с возвращением результирующего рекордсета соеденением с исходными строками.
31 окт 13, 14:24    [15058767]     Ответить | Цитировать Сообщить модератору
 Re: В чем сила CROSS APPLY ?  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
без cross apply:
select 
  d.value,
  (select s.name from sprav s where s.key=d.sprav_id)
from data d

расширение за счет cross apply:
select
  d.value,
  spr.name, spr.comment -- для одной строки d может быть несколько строк spr
from data d
cross apply(
  select s.name, s.comment -- несколько полей выборки
  from sprav s
  where s.key1=d.sprav_id or s.key2=d.sprav_id
  ) spr

Однократное вычисление формул:
select d.text, ci.poz, l.txt, stuff(d.text,1,ci.poz+1,'') rest_txt
from data d
cross apply(select charindex(',',d.text+',')-1)ci(poz)
cross apply(select left(d.text, ci.poz))l(txt)
31 окт 13, 14:30    [15058819]     Ответить | Цитировать Сообщить модератору
 Re: В чем сила CROSS APPLY ?  [new]
ЗадумчивыйПассажир
Guest
2Cygapb-007 Спасибо !
31 окт 13, 15:07    [15059088]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить