none
Für einen Import zu einem Drittprodukt einen Update-Query oder mehrere? RRS feed

  • Frage

  • Hallo zusammen.

    First of all, ich wünsche allen ein schönes, neues Jahr.

    Da die Arbeit nicht ruht, bin ich an folgendes Problem gestossen, welche meine SQL Kenntnisse bei Weitem überschreiten. (Ich hoffe, dass ich euch nicht in das falsche Forum geschrieben habe!)

    Ich versuche euch nun dies möglichst gut zu erklären und hoffe, ihr könnt mir irgendwie behilflich sein...

    Wir haben einen Import in ein Drittprodukt (ich nenne dieses Produkt GLKMnno) vom SQL Server (2005) aus. Dort möchte ich Computerdaten importieren, was mittels einer (ODBC?) Verbindung auch gehen würde. Es gibt 3 Regeln zu beachten (und 2 Einschränkungen).

    Regel 1:
    Das Feld 'Report Date' (von der Staging-Table in der DB) soll grösser als 'Modified Date' (im GLKMnno) sein.

    Regel 2:
    Owner-Daten (Felder 'Owner', 'Owner Contact', 'Owner Site' & 'Owner Sector' im GLKMnno) dürfen nur aktualisiert werden, wenn das Feld 'Install Date' (von der Staging-Table in der DB) grösser als dasselbe Feld (im GLKMnno) ist.

    Hier gibt es allerdings eine Ausnahme:
    Falls das Feld "Owner"  (im GLKMnno) den Wert 'ALEAB' hat, müssen die Felder 'Owner' & 'Owner Contact' auch geändert werden, obwohl 'Install Date' (von der Staging-Table in der DB) kleiner als dasselbe Feld (im GLKMnno) ist. --> Klingt also fast nach einer Regel 2b...

    Regel 3:
    Das Feld 'Last User' (im GLKMnno) wird nur geändert (mit dem Wert der Staging-Table in der DB), falls 3 weitere Felder 'FeldBB', 'FeldCC' & 'FeldDD' (von der Staging-Table in der DB) ungleicher Wert wie 'FeldBB', 'FeldCC' & 'FeldDD' (im GLKMnno) haben.

    Ich hoffe, bis jetzt könnt ihr noch einigermassen folgen.
    Da ich nicht wirklich ein Update-Query Experte bin, habe ich gehofft, ihr könntet mir helfen?

    Ein SQL Statement habe ich bereits versucht - einigermassen *hust*.

    SELECT     *
    FROM        GLKMnno GLK
    INNER JOIN
                      Staging-Table ST
    ON             GLK.UniqueID = ST.UniqueID
    WHERE     ST.ModifiedDate < GLK.ReportDate     -- Regel 1
    AND           (ST.InstallDate < GLK.InstallDate OR UPPER (BCS.Owner) = 'ALEAB')      -- Regel 2 ohne Ausnahmeregel
    AND           ((ST.FeldBB != GLK.FeldBB) AND (ST.FeldCC != GLK.FeldCC) AND (ST.FeldDD != GLK.FeldDD))

     

    Kann mir jemand von euch weiterhelfen? Ich weiss, dass ich eigentlich kein Select Statement benötige, aber mittels Update hätte ich es nichtmal so weit gebracht. Das Problem ist ja jetzt auch, dass je nach Regel nicht alle Felder aktualisiert werden dürfen. Benötige ich hierfür mehrere Update-Queries?

    Ich wäre sehr dankbar für jegliche Hilfe!

    Viele Grüsse
    Mikey

    Montag, 3. Januar 2011 11:33

Antworten

  • Hallo Mikey,
    leider waren die Angaben bezüglich ReportDate in der Beschreibung und dem SQL widersprüchlich. Ich habe mich jetzt mal an die Beschreibung gehalten. Vereinfacht sollte es wie folgt gehen, wobei ich die Unterscheidungen als Case in das Update eingebaut habe. Falls Du natürlich auch noch ein Insert benötigst, ist dies separat zu codieren wenn das Zielsystem kein MERGE unterstützt. Leider schreibst Du ja nicht viel dazu...

    declare @GLKMnno as table(UniqueID integer, ModifiedDate datetime,
    InstallDate datetime, Owner varchar(100));
    declare @Staging as table(UniqueID integer, ReportDate datetime, InstallDate
    datetime, Owner varchar(100));
    
    insert into @GLKMnno(UniqueID, ModifiedDate, InstallDate, Owner) values( 1,
    '20110101', '20101201', 'Tim');
    insert into @GLKMnno(UniqueID, ModifiedDate, InstallDate, Owner) values( 2,
    '20101201', '20101101', 'Struppi');
    insert into @GLKMnno(UniqueID, ModifiedDate, InstallDate, Owner) values( 3,
    '20101001', '20100901', 'ALEAB');
    
    insert into @Staging(UniqueID, ReportDate, InstallDate, Owner) values( 1,
    '20110102', '20101202', 'Max');
    insert into @Staging(UniqueID, ReportDate, InstallDate, Owner) values( 2,
    '20110101', '20101101', 'Moritz');
    insert into @Staging(UniqueID, ReportDate, InstallDate, Owner) values( 3,
    '20110102', '20100901', 'Foxy');
    
    Select *
    from @GLKMnno;
    
    Update @GLKMnno
    set Owner = case when ST.InstallDate > GLK.InstallDate or GLK.Owner =
    'ALEAB' then ST.Owner else GLK.Owner end
    FROM @GLKMnno GLK
    INNER JOIN @Staging ST ON GLK.UniqueID = ST.UniqueID
    WHERE ST.ReportDate > GLK.ModifiedDate;
    
    Select *
    from @GLKMnno;

    Einen schönen Tag noch,
    Christoph


    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu

    • Als Antwort markiert Mikey87 Dienstag, 4. Januar 2011 11:31
    Dienstag, 4. Januar 2011 08:02

Alle Antworten

  • Hallo Mikey,
    leider waren die Angaben bezüglich ReportDate in der Beschreibung und dem SQL widersprüchlich. Ich habe mich jetzt mal an die Beschreibung gehalten. Vereinfacht sollte es wie folgt gehen, wobei ich die Unterscheidungen als Case in das Update eingebaut habe. Falls Du natürlich auch noch ein Insert benötigst, ist dies separat zu codieren wenn das Zielsystem kein MERGE unterstützt. Leider schreibst Du ja nicht viel dazu...

    declare @GLKMnno as table(UniqueID integer, ModifiedDate datetime,
    InstallDate datetime, Owner varchar(100));
    declare @Staging as table(UniqueID integer, ReportDate datetime, InstallDate
    datetime, Owner varchar(100));
    
    insert into @GLKMnno(UniqueID, ModifiedDate, InstallDate, Owner) values( 1,
    '20110101', '20101201', 'Tim');
    insert into @GLKMnno(UniqueID, ModifiedDate, InstallDate, Owner) values( 2,
    '20101201', '20101101', 'Struppi');
    insert into @GLKMnno(UniqueID, ModifiedDate, InstallDate, Owner) values( 3,
    '20101001', '20100901', 'ALEAB');
    
    insert into @Staging(UniqueID, ReportDate, InstallDate, Owner) values( 1,
    '20110102', '20101202', 'Max');
    insert into @Staging(UniqueID, ReportDate, InstallDate, Owner) values( 2,
    '20110101', '20101101', 'Moritz');
    insert into @Staging(UniqueID, ReportDate, InstallDate, Owner) values( 3,
    '20110102', '20100901', 'Foxy');
    
    Select *
    from @GLKMnno;
    
    Update @GLKMnno
    set Owner = case when ST.InstallDate > GLK.InstallDate or GLK.Owner =
    'ALEAB' then ST.Owner else GLK.Owner end
    FROM @GLKMnno GLK
    INNER JOIN @Staging ST ON GLK.UniqueID = ST.UniqueID
    WHERE ST.ReportDate > GLK.ModifiedDate;
    
    Select *
    from @GLKMnno;

    Einen schönen Tag noch,
    Christoph


    Microsoft SQL Server MVP
    http://www.insidesql.org/blogs/cmu

    • Als Antwort markiert Mikey87 Dienstag, 4. Januar 2011 11:31
    Dienstag, 4. Januar 2011 08:02
  • Hallo Christoph

    Als 1. Vielen Dank für deine Hilfe.

    Es tut mir Leid, da unterlief mir wirklich ein Fehler bei der Beschreibung und dem SQL.

    Nein ein Insert benötige ich nicht, nur ein Update. Beim Insert überprüft er nur, ob die zwei Unique ID's gleich sind. Falls nicht, importiert er den Eintrag.

    Dann denke ich, so sollte es klappen. Vielen Dank!

    Grüsse,
    Mikey

    Dienstag, 4. Januar 2011 11:31