Announcement

Collapse
No announcement yet.

Abfrage aus 4 Tabellen (Timeout)

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

  • Abfrage aus 4 Tabellen (Timeout)

    Hallo,
    ich habe eine Abfrage aus 4 Tabellen gemacht, welche bei meiner Web-Anwendung zu einem Timeout führt. Somit ist der Fehler gefunden... schlechte Abfrage

    Leider habe ich noch keinen besseren Weg gefunden. Vielleicht kann mir hier jemand helfen.

    Ausgangslage:

    MSSQL 2000
    4 Tabellen (Anfangsbestand, Einkauf, Verbrauch, Endbestand)

    Anfangsbestand (ab_artikel, ab_charge, ab_lager, ab_menge, ab_preis)
    Einkauf (ek_artikel, ek_charge, ek_lager, ek_menge, ek_preis)
    Verbrauch (vb_artikel, vb_charge, vb_lager, vb_menge, vb_preis)
    Endbestand (eb_artikel, eb_charge, eb_lager, eb_menge, eb_preis)

    Ich lese 4 Dateien in die Datenbank ein um zu überprüfen ob die darin enthaltenen Daten auch korrekt sind.

    AB = Tabelle Anfangsbestand
    EK = Tabelle Einkauf
    VB = Tabelle Verbrauch
    EB = Tabelle Endbestand

    Welche Kombinationen sind erlaubt.
    AB - VB - EB
    AB - VB
    AB - EB
    EK - VB - EB
    EK - VB
    EK - EB

    Die Werte artikel, charge und lager definieren meine Schlüssel.

    Meine Ausgabe sollte wie folgt aussehen, da ich diese Werte wieder in eine andere Tabelle schreibe.


    ab_artikel, ab_charge, ab_lager, ab_menge, ab_preis, ek_menge, ek_preis, vb_menge, vb_preis, eb_menge, eb_preis

    Wenn artikel, charge und lager in einer Tabelle nicht vorkommen soll einfach eine 0 drin stehen.

    ich habe das so gemacht....
    zB für den Fall AB - EB

    Code:
    Select ab_artikel, ab_charge, ab_lager, '0' as ek_menge, '0' as ek_preis, '0' as vb_menge, '0' as vb_preis, eb_menge, eb_preis
    From anfangsbestand, endbestand
    Where ab_artikel = eb_artikel and ab_charge = eb_charge and ab_lager = eb_lager and ab_charge not in (select ek_charge from einkauf) and ab_charge not in (select vb_charge from verbrauch)
    UNION ALL
    ..... usw für alle möglichen fälle.

    Umständlicher kann man das vermutlich nicht machen aber ich komme hier einfach nicht weiter.

    Bitte helft mir. Ich habe es schon mit JOIN's versucht aber ich möchte ja auch eine 0 stehen haben wenn ich keinen Wert in einer Tabelle finde.
    Habe sehr wenig Erfahrung mit JOINS und dieses Problem hier beschäftigt mich wirklich schon länger.

    lg
    MIK

  • #2
    Stichwort: OUTER JOIN

    Comment


    • #3
      Danke! Also das mit Outer JOIN habe ich schon versucht. Die Beschreibung liest sich so als würde das schon passen aber...

      Wenn ich zB keinen Anfangsbestand habe kann ich ab_artikel, ab_charge und ab_lager nicht ausgeben. Stattdessen müsste dort ek_artikel, ek_charge und ek_lager stehen.

      Außerdem weiß ich nicht wie ich diese ganzen Tabellen richtig "verknüpfen" kann.

      Hier ein Beispiel:

      Code:
      Select ab_artikel, ab_charge, ab_lager, ab_menge, ab_preis, ek_menge, ek_preis, vb_menge, vb_preis, eb_menge, eb_preis
      From _anfangsbestand FULL OUTER JOIN _einkauf 
      ON ab_artikel = ek_artikel AND ab_charge = ek_charge AND ab_lager = ek_lager
      FULL OUTER JOIN _verbrauch
      ON ek_artikel = vb_artikel AND ek_charge = vb_charge AND ek_lager = vb_lager
      FULL OUTER JOIN _endbestand
      ON vb_artikel = eb_artikel AND vb_charge = eb_charge AND vb_lager = eb_lager
      Das funktioniert leider nicht richtig. Ich vergleiche zwar ab mit ek oder ab mit vb aber ich vergleich zugleich nicht ab mit eb.

      Ich bin wirklich nicht sehr vertraut mit Joins darum hoffe ich auf weitere tips. Wenn möglich im Zusammenhang mit diesem "Full Outer Join" da die Performance sehr gut ist.

      Comment


      • #4
        Mit einem normalen Join geht das natürlich nicht. der OUTER JOIN sorgt nur dafür, das auch Datensätze, zu welchen es keine Entsprechung in der/den anderen tabellen gibt, daten Ausgegeben werden (dann halt NULL-Werte)

        Comment


        • #5
          wie könnte ich das sonst lösen? Über mehrere einzelne Abfragen über UNION ALL verbunden geht das nämlich nicht.

          Comment


          • #6
            Welches DBMS?
            IIf(), Case...When, COLAESCE

            Comment


            • #7
              Ok, danke ich glaube das hat meine Frage schon beantwortet.

              Somit kann ich eher nicht damit rechnen mein Problem mit einer einzelnen Abfrage zu lösen.

              Ich werde mich jetzt darauf konzentrieren, das ganze Schritt für Schritt zu vereinfachen. (Views)

              Danke erstmal!

              Comment


              • #8
                Man kann schon, man müsste das Feld halt bedingt setzen.

                Comment


                • #9
                  Hi,

                  ich versuche die Sache jetzt etwas anders anzugehen. Jetzt habe ich wieder ein Problem. Ich glaube ich stehe nur etwas auf dem Schlauch.

                  Ich habe ja wie oben erwähnt 3 Felder die eine Art Key definieren. (artikel, charge, lager)

                  Ich muss jetzt abfragen ob eine Kombination in einer anderen enthalten ist. Eigentlich möchte ich nur die Werte die nicht in einer anderen Tabelle enthalten sind. (Ich habe das jetzt über ein Subselect mit "NOT IN" versucht.) Leider funktioniert das nicht. Es werden mir natürlich zuviele ausgegeben.

                  Kleines Problem mit großer Wirkung.
                  Bsp:
                  Tabelle1
                  ART1, CHARGE1, LAGER1
                  ART2, CHARGE3, LAGER2

                  Tabelle2
                  ART1, CHARGE1, LAGER1
                  ART2, CHARGE2, LAGER2

                  Ergebnis: ART2, CHARGE2, LAGER2

                  Diese Kombination aus Tabelle2 ist nicht in 1 enthalten.

                  ist sicher auch nur ein einfaches Problem.

                  Comment


                  • #10
                    Select * from Tabelle2
                    where not exists(select * from Tabelle1
                    where Tabelle2.artikel=tabelle1.artikel
                    And Tabelle2.charge=tabelle1.charge
                    and Tabelle2.lager=tabelle1.Lager)

                    Gruß frauwue
                    docendo discimus

                    Comment


                    • #11
                      Danke für die schnelle Antwort. Ich komme dem Ergebnis näher. Leider bedeutet eine Abweichung von 2 Zeilen, dass es noch nicht ganz funktioniert.

                      Ich habe jetzt die fehlenden Werte von Tabelle1 in Tabelle2 geschrieben und umgekehrt.

                      Wenn ich jetzt nochmals die Tabellen vergleiche erhalte ich einen Unterschied von 0

                      Wenn ich allerdings die Anzahl der Einträge in den beiden Tabellen vergleiche beträgt der Unterschied 2

                      hmm.... wie geht das?

                      Theoretisch müsste die Abfrage falsch sein. Ich bin jetzt noch dran um das ganze zu prüfen.

                      Comment


                      • #12
                        Hallo,

                        hast Du vielleicht innerhalb einer Tabelle doppelte Darensätze?
                        docendo discimus

                        Comment

                        Working...
                        X