{"id":368,"date":"2007-12-17T19:39:07","date_gmt":"2007-12-17T18:39:07","guid":{"rendered":"http:\/\/soci.hu\/blog\/index.php\/2007\/12\/17\/sql-server-2008-ujdonsagok-7-merge-utasitas\/"},"modified":"2007-12-17T19:39:07","modified_gmt":"2007-12-17T18:39:07","slug":"sql-server-2008-ujdonsagok-7-merge-utasitas","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2007\/12\/17\/sql-server-2008-ujdonsagok-7-merge-utasitas\/","title":{"rendered":"SQL Server 2008 \u00fajdons\u00e1gok 7. &#8211; MERGE utas\u00edt\u00e1s"},"content":{"rendered":"<p>H\u00e1nyszor \u00edr le az ember ehhez hasonl\u00f3 sql blokkokat?<\/p>\n<p>if exists(select * from Tabla where oszl = @ize))<br \/>\n  update Tabla &#8230; where oszl = @ize<br \/>\nelse<br \/>\n  insert Tabla (&#8230;) values (@ize, &#8230;)<\/p>\n<p>Az egy dolog, hogy ilyenkor k\u00e9tszer kell nekimenni a t\u00e1bl\u00e1nak, ami teljes\u00edtm\u00e9nyvesztes\u00e9get okoz, de m\u00e9g arra is oda kell figyelni, hogy att\u00f3l, hogy az if azt monda, nem l\u00e9tezik a sor, az insert idej\u00e9ben m\u00e1r lehet, hogy egy p\u00e1rhuzamos folyamat besz\u00farta azt, pof\u00e1ra ejtve az insertet. Megfelel\u0151 izol\u00e1ci\u00f3s szinttel persze ez kiv\u00e9dhet\u0151, de akkor meg a konkurencia cs\u00f6kken. A f\u0151 gond az, hogy nem volt olyan utas\u00edt\u00e1s, ami ha m\u00e1r megn\u00e9zte, hogy l\u00e9tezik-e a sor, azon nyomban valamilyen m\u0171veletet v\u00e9gez rajta (update vagy delete), vagy bet\u00f6mi a lukat (insert). J\u00f6het a MERGE.<\/p>\n<p>A merge l\u00e9nyege, hogy van egy forr\u00e1s adathalmazunk \u00e9s egy c\u00e9l t\u00e1bl\u00e1nk. A kett\u0151 k\u00f6z\u00f6tt join jelleg\u0171 kapcsolatot adunk meg, amely seg\u00edts\u00e9g\u00e9vel p\u00e1roztatjuk a k\u00e9t oldal sorait. Mik\u00f6zben soronk\u00e9nt megy a p\u00e1roztat\u00e1s annak siker\u00e9t\u0151l vagy sikertelens\u00e9g\u00e9t\u0151l f\u00fcgg\u0151en k\u00fcl\u00f6nb\u00f6z\u0151 DML m\u0171veleteket hajthatunk v\u00e9gre.<\/p>\n<p>A k\u00f6vetkez\u0151 p\u00e9ld\u00e1t arc\u00e1tlanul elloptam a BOL-b\u00f3l:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nMERGE Production.ProductInventory AS pi\r\nUSING \r\n(SELECT ProductID, SUM(OrderQty) \r\nFROM Sales.SalesOrderDetail sod\r\nJOIN Sales.SalesOrderHeader soh\r\nON sod.SalesOrderID = soh.SalesOrderID\r\nAND soh.OrderDate = GETDATE()\r\nGROUP BY ProductID) \r\nAS src (ProductID, OrderQty)\r\nON (pi.ProductID = src.ProductID)\r\nWHEN MATCHED AND pi.Quantity - src.OrderQty &lt;&gt; 0 \r\n    THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty\r\nWHEN MATCHED AND pi.Quantity - src.OrderQty = 0 \r\n    THEN DELETE;\r\n<\/pre>\n<p>Ez lev\u00e1logatja a ma eladott term\u00e9keket, az id-j\u00fcket \u00e9s az ezen a napon eladott \u00f6ssz mennyis\u00e9get. Ezen adatok alapj\u00e1n babr\u00e1n a rakt\u00e1rk\u00e9szleten, az ProductInventory t\u00e1bl\u00e1n.<br \/>\nHa a ProductID-nek megfelel\u0151 sor van a ProductInventory-ban \u00e9s levonva a ma eladott cuccokat m\u00e9g marad rakt\u00e1ron, akkor update-elj\u00fck a rakt\u00e1ron lev\u0151 term\u00e9ksz\u00e1mot. Ha pont annyit adtak ma el, amennyi rakt\u00e1ron volt, akkor kit\u00f6rlik a rakt\u00e1ros sort, minek egy 0-s sor (persze, ez most egy mesters\u00e9ges feladat, nem felt\u00e9tlen t\u00f6r\u00f6ln\u00e9nk ki \u00e9l\u0151ben). <\/p>\n<p>Lehetne m\u00e9g \u00edrni m\u0171veleteket azokra az estekre is, ha valamelyik oldanak nincs p\u00e1rja a m\u00e1sik oldalon. Majd, ha aludtam egyet, \u00edrok ilyen p\u00e9ld\u00e1t. :)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>H\u00e1nyszor \u00edr le az ember ehhez hasonl\u00f3 sql blokkokat? if exists(select * from Tabla where oszl = @ize)) update Tabla &#8230; where&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,4,58],"tags":[],"class_list":["post-368","post","type-post","status-publish","format-standard","hentry","category-adatbazisok","category-szakmai-elet","category-sql-server-2008"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/368","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=368"}],"version-history":[{"count":0,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/368\/revisions"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=368"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=368"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=368"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}