Operatorul APPLY in SQL 2005

CREATE TABLE dbo.Items
(
ID int IDENTITY(1,1) NOT NULL,
Name varchar(50) NOT NULL,
CONSTRAINT PK_Items PRIMARY KEY (ID ASC)
)
-- Ceva valori
GO
INSERT INTO Items VALUES ('X')
INSERT INTO Items VALUES ('Y')
INSERT INTO Items VALUES ('Z')

-- O functie care returneaza itemurile care au id-ul mai mic decat @ItemID (cele anterioare unui anumit item)
GO
CREATE FUNCTION [dbo].[getPreviousItems]
(
@ItemID int
)
RETURNS @PreviousItemTab TABLE
(
ID int,
Name varchar(50)
)
AS

BEGIN

INSERT INTO @PreviousItemTab
SELECT *
FROM dbo.Items AS i
WHERE i.ID < @ItemID

RETURN
END


Operatorul APPLY implica doi operanzi, primul operand (LEFT) actioneaza ca si input pentru cel de-al doilea (RIGHT). Pentru fiecare linie din rezultatul operandului LEFT se va evalua operandul RIGHT

Operatorul APPLY e de doua tipuri: CROSS APPLY si OUTER APPLY. Rezultatul lui CROSS APPLY nu va include liniile pentru care LEFT returneaza NULL in urma evaluarii, iar OUTER APPLY va include si aceste linii, pentru care evaluarea e nula



SELECT i.Name as Input,
f.*
FROM Items AS i
CROSS APPLY dbo.getPreviousItems(i.ID) AS f
ORDER BY i.ID

Pe acest exemplu, operandul RIGHT este rezultatul evaluarii SELECT i.Name FROM Items as I ORDER BY i.ID, iar operandul LEFT este dbo.getPreviousItems(i.ID) AS f, adica acea functie care returneaza item-urile anterioare unuia.

Rezultatul operatorului APPLY va fi format din coloanele Name din RIGHT precum si coloanele ID si Name din LEFT. Nu vor fi nume anonime sau generate, ci cele definite fie de tabela fie de functie.

Daca functia getPreviousItems returneaza doua sau mai multe randuri pentru inputul RIGHT, atunci Name va fi repetat pe fiecare linie. Daca e folosit CROSS APPLY, inputul nu va fi inclus in cazul in care functia returneaza NULL (Itemul nu are itemi anteriori). Daca e folosit OUTER, atunci rezultatul include si id-urile care nu au item-uri anteriori


Deci pentru CROSS APPLY rezulatul ar fi:

Input ID Name
--------- ---------------------
Y 1 X
Z 1 X
Z 2 Y

Iar pentru OUTER APPLY e:

Input ID Name
--------- ---------------------
X NULL NULL
Y 1 X
Z 1 X
Z 2 Y

Comments

Popular posts from this blog

IIS 7.5, HTTPS Bindings and ERR_CONNECTION_RESET

Verify ILogger calls with Moq.ILogger

Table Per Hierarchy Inheritance with Column Discriminator and Associations used in Derived Entity Types