MSSql: TSql рдореЗрдВ APPLY рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдХреБрдЫ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХреЛрдб рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реБрдП, рдореБрдЭреЗ рдкреНрд░рддреНрдпреЗрдХ рдЗрдХрд╛рдИ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рдПрди рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ kuda78 рдиреЗ рдмрд╣реБ-рдордВрдЬрд┐рд▓рд╛ рдЪрдпрди рдХреЗ рдмрдЬрд╛рдп SelectMany рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ред
рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЛрдб LinqToSQL рдЬреЛ рдмрдирд╛рддрд╛ рд╣реИ рдХреА рдЦреЛрдЬ, рдореИрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдПрд╕рдХреНрдпреВрдПрд▓ рдмрдпрд╛рди рднрд░ рдореЗрдВ рдЖрдпрд╛ рдЬрд┐рд╕реЗ рдПрдкреАрдкреАрдПрд▓рд╡рд╛рдИ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЬреИрд╕рд╛ рдХрд┐ MSDN рдХрд╣рддрд╛ рд╣реИ, рдпрд╣ рдХрдорд╛рдВрдб рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:
http://technet.microsoft.com/en-us/library/ms175156.aspx
APPLY рдСрдкрд░реЗрдЯрд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдХреНрд╡реЗрд░реА рдХреА рдмрд╛рд╣рд░реА рддрд╛рд▓рд┐рдХрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреЗрдмрд▓-рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рддрд╛рд▓рд┐рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рд╡рд╣ рдПрдХ рд╕рд╣реА рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдмрд╛рд╣рд░реА рддрд╛рд▓рд┐рдХрд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдмрд╛рдПрдВ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреА рд╣реИред рдмрд╛рдПрдВ рдЗрдирдкреБрдЯ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдЗрдирдкреБрдЯ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрддреНрдкрдиреНрди рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЕрдВрддрд┐рдо рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕рдВрдпреБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред APPLY рдХрдерди рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕реНрддрдВрднреЛрдВ рдХреА рд╕реВрдЪреА рдмрд╛рдПрдВ рдЗрдирдкреБрдЯ рдореЗрдВ рд╕реНрддрдВрднреЛрдВ рдХрд╛ рд╕рдореВрд╣ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рджрд╛рдПрдВ рдЗрдирдкреБрдЯ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рд╕реНрддрдВрднреЛрдВ рдХреА рд╕реВрдЪреА рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, APPLY рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓ рд╣реИред

рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:
рдХрд╛рд░реНрдп: рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо 10 рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред

рдЖрдЗрдП рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд░рд▓ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕рдВрд░рдЪрдирд╛:
CREATE TABLE Customer ( CustomerID INT PRIMARY KEY, CustomerName NVARCHAR(30) NOT NULL ) CREATE TABLE Nomenclature ( NomenclatureID INT PRIMARY KEY, NomenclatureName NVARCHAR(30) NOT NULL, Price MONEY NOT NULL ) CREATE TABLE Deal ( DealID INT IDENTITY(1, 1) PRIMARY KEY, CustomerID INT NOT NULL, NomenclatureID INT NOT NULL, [Count] DECIMAL(8,2) NOT NULL, DealDate DATETIME NOT NULL ) 


рдЕрдм рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо 10 рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛: рдкрд╣рд▓рд╛, рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рддрд╛рд░реАрдЦ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЙрд╕рдХреЗ 10 рдЖрджреЗрд╢ рдереЗ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рддрд┐рдерд┐ рд╕реЗ рд╕рднреА рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ред
 SELECT d.DealDate, c.CustomerName, n.NomenclatureName, n.Price, d.Count FROM Customer c JOIN Deal d ON d.CustomerID = c.CustomerID JOIN (SELECT c.CustomerID, (SELECT MIN(lastDeals.DealDate) FROM (SELECT TOP 10 d1.DealDate FROM Deal d1 WHERE d1.CustomerID = c.CustomerID ORDER BY d1.DealDate DESC) LastDeals) LastDealDate FROM Customer c) ld ON ld.CustomerID = c.CustomerID JOIN Nomenclature n ON n.NomenclatureID = d.NomenclatureID WHERE d.DealDate >= ld.LastDealDate ORDER BY c.CustomerName, d.DealDate DESC 

* рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдпрд╣ рдзрд╛рд░рдгрд╛ рдмрдирд╛рдИ рдХрд┐ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ 2 рдЖрджреЗрд╢ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред

APPLY SQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдХреЛрдб рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ:
 SELECT d.DealDate, c.CustomerName, n.NomenclatureName, n.Price, d.Count FROM Customer c OUTER APPLY (SELECT TOP 10 d1.* FROM Deal d1 Where d1.CustomerID = c.CustomerID ORDER BY d1.DealDate DESC) d INNER JOIN Nomenclature n ON n.NomenclatureID = d.NomenclatureID ORDER BY c.CustomerName, d.DealDate DESC 

рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЕрдиреБрдХреНрд░рдорд┐рддреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХреА рдпреЛрдЬрдирд╛ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рднреА рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреЛ рдкреНрд░реЗрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд╛рдо рдореЗрдВ рдЖрдПрдЧрд╛ред

рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдбреЗрдЯрд╛рдмреЗрд╕ рдлрд╝рд╛рдЗрд▓ : CreateDB.txt
SQL рдХреНрд╡реЗрд░реА рдлрд╝рд╛рдЗрд▓: Queries.txt

Source: https://habr.com/ru/post/In119054/


All Articles