Víš o tom, že všechny systémy na kterých Notino funguje, programujeme sami?
Náš e-shop je pouze špičkou ledovce, pod kterou je schovány nejnovější technologie jako jsou např. nejnovější verze Kubernetes.
Systémy které děláme, slouží pro miliony uživatelů. Mezi ně patří vlastní skladový systém, BI, mzdový systém, vlastní CRM a mnoho dalších business utilit.

Právě teď máš možnost to zažít a vidět, kde vznikají projekty, které hýbou světem e-commerce.

KDY? Ve středu 3.10. od 17:00 hodin
KDE? Notino, Londýnské náměstí 6, Brno
REGISTRACE? Máme limitovanou kapacitu 45 míst. Včas si zaregistruj lupen zde https://www.eventbrite.com/e/notino-tech-day-tickets-50068177266

PROGRAM:
16:30 – 17:00 Příchod, občerstvení, chill out
17:00 – 17:15 Poznej Tech Notino, aneb jednotlivé domény, které provozujeme
17:15 – 17:30 Představení našeho logistického systému
17:30 – 17:45 Představení našeho finančního systému
17:45 – 18:00 Představení našeho webu
18:15 – 18:45 Představení naší ELIS, kterou si jak jinak než děláme sami
18:45 – 19:00 Pauza, občerstvení, chill out
19:00 – 19:30 Arduino roboti, vyzkoušej si naprogramovat vlastní dopravníkový pás
19:30 – 20:00 Poznej Notino, aneb prohlídka toho, kde všechno vzniká

Merge je SQL příkaz, který umí porovnat dvě tabulky a na základě podmínky provádí INSERT, UPDATE nebo DELETE.

Syntaxe:

MERGE TARGET_TABLE AS TARGET

USING SOURCE_TABLE AS SOURCE

ON

WHEN MATCHED THEN

WHEN NOT MATCHED BY TARGET THEN

WHEN NOT MATCHED BY SOURCE THEN;
 

Příklad:

Potřebuji do tabulky vložit záznam pokud neexistuje. V opačném případě upravím jeden sloupec.

První co nás může napadnout je použití samostatných příkazů SELECT a na základě výsledku provést INSERT nebo UPDATE.

  var exists = connection.QueryFirstOrDefault<bool>("SELECT 1 FROM [dbo].[Products] WHERE ProductId1 = @ProductId1 AND ProductId2 = @ProductId2 AND Date = @Date", new

    {

        up.ProductId1,

        up.ProductId2,

        up.DateTime.Date

    });

    if (exists)

    {

        connection.Execute("UPDATE [dbo].[Products] SET Count = Count+1 WHERE ProductId1 = @ProductId1 AND ProductId2 = @ProductId2 AND Date = @Date", new

        {

            up.ProductId1,

            up.ProductId2,

            up.DateTime.Date

        });

    }

    else

    {

        connection.Execute("INSERT INTO [dbo].[Products] ([ProductId1], [ProductId2], [Date], [Count]) VALUES (@ProductId1, @ProductId2, @Date, @Quantity)", new

        {

            up.ProductId1,

            up.ProductId2,

            up.DateTime.Date,

            up.Quantity

 

        });

    }

 

Abychom si ušetřili několik řádků a zbytečně vytěžovali databázi několika příkazi, můžeme použít MERGE SQL, který dokáže na základě výsledku z porovnání tabulek provést buď INSERT nebo UPDATE.

 

 await connection.ExecuteAsync(@"
MERGE Products AS target


                                            USING(SELECT @ProductId1, @ProductId2, @Date, @Quantity, @LanguageId) AS source(ProductId1, ProductId2, Date, Quantity, LanguageId)

                                               ON(target.ProductId1 = source.ProductId1 AND target.ProductId2 = source.ProductId2 AND target.Date = source.Date AND target.LanguageId = source.LanguageId)

                                             WHEN MATCHED THEN

                                                  UPDATE SET Quantity = @Quantity + 1

                                             WHEN NOT MATCHED THEN

                                                  INSERT(ProductId1, ProductId2, Date, Quantity, LanguageId) VALUES(source.ProductId1, source.ProductId2, source.Date, source.Quantity, source.LanguageId);", new

                    {

                        up.ProductId1,

                        up.ProductId2,

                        up.DateTime.Date,

                        up.LanguageId,

                        Quantity = 1,

 

                    });