Announcement

Collapse
No announcement yet.

Update über 3 Tabellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Update über 3 Tabellen

    Aloha und guten Abend,

    da ich leider keinen Plan davon habe wie ich folgendes aufzustellen habe bitte ich euch mir zu helfen.

    Tabelle B hat über die ID einen Bezug zu Tabelle A, d.h. zum Beispiel:
    Auf Test A ist windows 2003 sowie ein IIS installiert.

    Problemstellung:


    Tabelle A
    ID ( eindeutig ) Name Inv
    1 TestA 10
    2 TestB 0
    3 TestC 10
    4 TestD 0

    Tabelle B
    ID Software
    1 Windows 2003
    1 IIS
    2 Windows 2000
    2 SQL
    3 Windows 2000
    3 BEA Weblogic
    4 Windows 2000
    4 IIS

    Tabelle C
    Name
    TestA
    TestC


    Die Aufgabe:

    1. In der Tabelle A soll die Spalte "Inv" mit einer 10 gefüllt werden sobald die Namen in Tabelle C auftauchen.

    2. In der Tabelle A soll die Spalte "Inv" mit einer 20 gefüllt werden sobald in Tabelle B entweder mit "IIS" oder "BEA..." gefüllt sind aber noch nicht in Tabelle C aufgeführt sind.

    Anmerkung zu 1: dies habe ich hinbekommen per "UPDATE" Kommando

    Anmerkung zu 2: dies habe ich leider noch nicht hinbekommen.


    Ich habe es schon mit IF... probiert aber irgendwie will das Kommando nicht so wie ich will.

    Hoffe Ihr könnt mir helfen.

    Greets,

    The Dodger

  • #2
    Machst du am einfachsten mit EXISTS ... :
    Code:
    update tabelle_A set Inv = 20 where exists
      (select * from tabelle_B where tabelle_B.id = tabelle_A.id
      and (tabelle_B.Software = 'IIS' or tabelle_B.Software like 'BEA%') )
      and not exists (select * from tabelle_C where tabelle_C.name = tabelle_A.name)
    ungetestet !!

    bye,
    Helmut

    Comment


    • #3
      Superb,

      getestet und läuft einwandfrei. Jetzt muss ich nur noch 1 und 2 kombinieren.

      Ich denke das sollte über eine IF... Schleife funktionieren, oder?

      Greets,

      The Dodger



      EDIT: habe es selbst herausgefunden. Brauchte einfach 2 an 1 anzuhängen.
      Zuletzt editiert von dodger; 28.12.2007, 22:03. Reason: Lösung

      Comment


      • #4
        AAAAAAhhhhh,

        ich hasse es wenn sich Aufgaben ändern.
        Jetzt kommt mein Boss mit einer anderen Struktur.


        OK neue Aufgabenstellung

        Tabelle B hat über die ID einen Bezug zu Tabelle A, d.h. zum Beispiel:
        Auf Test A ist windows 2003 sowie ein IIS installiert.

        Problemstellung:

        Tabelle A
        ID ( eindeutig ) Name local Inv
        1 TestA IIS 10
        2 TestB Winzip 0
        3 TestC Winzip 10
        4 TestD IIS 0

        Tabelle B
        ID Software
        1 Windows 2003
        2 Windows 2000
        2 SQL
        3 Windows 2000
        3 BEA Weblogic
        4 Windows 2000


        Tabelle C
        Name
        TestA
        TestC


        Die Aufgabe:

        1. In der Tabelle A soll die Spalte "Inv" mit einer 10 gefüllt werden sobald die Namen in Tabelle C auftauchen.

        2. In der Tabelle A soll die Spalte "Inv" mit einer 20 gefüllt werden sobald in Tabelle B mit "BEA..." oder Tabelle A mit "IIS" gefüllt sind aber noch nicht in Tabelle C aufgeführt sind.

        3. der Rest soll bei 0 bleiben

        Anmerkung zu 1: dies habe ich hinbekommen per "UPDATE" Kommando

        Anmerkung zu 2: Hatte gedacht das ich das mit dem o.a. Kommando abbilden kann, aber leider berücksichtigt die o.a. Formel nicht die 3 Bedingung( d.h. alle Maschinen die vorher ein 0 unter "Inv" hatten sind jetzt mit einer 20 belegt ).

        Das Ergebnis eines SELECT sollte dann so aussehen:

        ID Name local Inv
        1 TestA IIS 10
        2 TestB Winzip 0
        3 TestC Winzip 10
        4 TestD IIS 20

        Greets,

        The Dodger

        Comment


        • #5
          OK habe es doch hinbekommen

          Code:
          UPDATE Tabelle_A SET Inv = 10
          WHERE ID IN ( 
           SELECT ID FROM Tabelle_A, Tabelle_C 
           WHERE Tabelle_A.Name = Tabelle_C.Name)
          go
          update Tabelle_A set Inv = 20 where exists
            (select Software from Tabelle_B where Tabelle_B.ID = Tabelle_A.ID
            and Tabelle_B.Software like '%BEA%')
            and not exists (select Name from Tabelle_C where Tabelle_C.Name = Tabelle_A.Name)
          go
          update Tabelle_A set Inv = 20 where
            Tabelle_A.local like '%IIS%'
            and not exists (select Name from Tabelle_C where Tabelle_C.Name = Tabelle_A.Name)
          go
          Es funktioniert zwar, aber ich finde das man dieses doch sicher noch effektiver gestalten kann.
          Ich habe die Befürchtung das ich damit den SQL etwas zu sehr beanspruche.

          Nur wie gestalte ich das effektiver???


          Greets,

          The Dodger

          Comment


          • #6
            Hi,

            wenn Du zuerst Inv=10 setzt, wenn in Tabelle_C was da ist, brauchst Du für
            die weiteren Updates nur Inv auf <>10 abzufragen und sparst Dir damit das
            zeitaufwändigere "where not exists"



            Code:
            UPDATE Tabelle_A SET Inv = 10
            WHERE ID IN ( 
             SELECT ID FROM Tabelle_A, Tabelle_C 
             WHERE Tabelle_A.Name = Tabelle_C.Name)
            go
            update Tabelle_A set Inv = 20 where inv <> 10
            and
             (Tabelle_A.local like '%IIS%'
              or   exists
              (select Software from Tabelle_B where Tabelle_B.ID = Tabelle_A.ID
              and Tabelle_B.Software like '%BEA%'))
            go
            Gruß
            docendo discimus

            Comment


            • #7
              Juchuu,

              läuft wie gewünscht. Vielen Dank für die Hilfe....

              Greets,

              The Dodger

              Comment

              Working...
              X