Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Merge zweier Table-Variablen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von kraeppy, 29 Juni 2016.

  1. kraeppy

    kraeppy Benutzer

    guten morgen,

    für produkte gibt es forecasts, diese werden als datei 2-3x am tag heruntergeladen und die informationen in die datenbank importiert.
    leider ist die logik für die tabelle, in die diese werte geschrieben, so, dass nur die neuesten daten als "richtig" anerkannt werden, die vorhandenen verschwinden dann in eine history-tabelle.
    zu einem produkt und einem tag werden jeweils 100 Viertelstundenwerte gespeichert. (100 wegen zeitumstellung).

    abgespecktes beispiel:
    datei 1: 30.6.2016 hat einen forecast von 10:00 - 18:00
    datei 2: 30.6.2016 hat einen forecast von 14:00-22:00.

    problem ist, dass durch den import der neuen datei die informationen von 10:00-14:00 nicht mehr vorhanden sind (nur noch in der history-tabelle).

    jetzt wollte ich hergehen und folgende abfrage schreiben:

    in zwei table-variablen (target = aktuelle tabelle, source = history) die daten für die produkte, die mich interessieren, ablegen und mit einem mergebefehl die alten daten aus history-tabelle zu den neuen hinzufügen mit der logik: "wenn der neue viertelstunden-forecast = 0, dann nimm den alten, ansonsten den neuen".

    Code:
    merge @prices as _target
    using @prices_hist as _source
    on
    (
            _target.product_id = _source.product_id
        and _target.trading_day = _source.trading_day
        and _target.date_from = _source.date_from
        and _target.date_to = _source.date_to
    )
    when matched then
    update set
          _target.val_1 = case _source.val_1 when 0 then _target.val_1 else _source.val_1 end,
          ...
      _target.val_100 = case _source.val_100 when 0 then _target.val_100 else _source.val_100 end
    
    when not matched then
    insert ([product_id],  [trading_day], [date_from], [date_to], [price], [val_1],..., [val_99], [val_100])
    values (1,  getdate(), getdate(), getdate(), 1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1);
    
    select * from @prices
    
    zum schluss mit dem insert 1,1,1,1,..... hab ich nur aus testzwecken gemacht.

    beim letzten select * from @prices hab ich jetzt erwartet, dass die tabelle mit den alten werten aktualisiert wurde... wurde sie aber nicht und ich versteh grad nicht warum :-?

    die daten in den feldern, die in dem on-block stehen, sind alle gleich. da habe ich fünf mal drauf geachtet ^^

    wenn mir jemand weiterhelfen kann, wär lieb :)

    grüße und frohes schaffen

    kraeppy
     
  2. akretschmer

    akretschmer Datenbank-Guru

    ich nix m$-sql, aber erst einmal klang das für mich nach einem Fall für Union (ALL).
     
  3. kraeppy

    kraeppy Benutzer

    ich bin so dusselig -.-

    beim insert in die history-table-variable ist mir ein tippfehler bei der produkt-id unterlaufen weshalb kein match statt fand -.-
    da hat mich gerade ein kollege drauf hingewiesen...

    sry für die umstände.

    lg kraeppy
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden