Announcement

Collapse
No announcement yet.

Verschachtelte Abfrage

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

  • Verschachtelte Abfrage

    Hallo ich habe 3 Tabellen miteinander verknüpft. Tabelle 1 beinhaltet alle Adressdaten, Tabelle 2 alle Daten zu einem Objekt( Gerät) und Tabelle 3 alle Daten zu dem Zubehör für die Geräte.

    Ich möchte mir jetzt alle Kunden anzeigen lassen, welche ein bestimmtes Zubehör nicht besitzen. mit folgender Abfrage kann ich mir wunderbar anzeigen lassen welche Kunden dieses Zubehör besitzen:

    SELECT dbo.KHKAdressen.Referenz, dbo.KHKAdressen.Name1, dbo.KHKAdressen.Name2, dbo.KHKAdressen.LieferStrasse, dbo.KHKAdressen.LieferLand, dbo.KHKAdressen.LieferPLZ, dbo.KHKAdressen.LieferOrt
    FROM dbo.KHKAdressen
    where dbo.KHKAdressen.Referenz in
    (
    SELECT dbo.KHKAdressen.Referenz
    FROM dbo.KHKAdressen inner JOIN dbo.BCSPjmObjekte ON dbo.KHKAdressen.Adresse = dbo.BCSPjmObjekte.Adresse where dbo.BCSPjmObjekte.Objektnummer IN
    (SELECT BCSPjmObjekte.Objektnummer FROM BCSPjmObjekte Inner join dbo.BCSPjmObjekteZubehoer ON dbo.BCSPjmObjekte.Objektnummer = dbo.BCSPjmObjekteZubehoer.Objektnummer
    where dbo.BCSPjmObjekteZubehoer.Artikelnummer IN ('7711001242', '7711001050', '11000013'))
    )

    warum funktioniert das nicht mit NOT IN? Ich erhalte 0 Datensätze zurück. Hab ich nen Denkfehler drin? bin am Verzweifeln :-P

    SELECT dbo.KHKAdressen.Referenz, dbo.KHKAdressen.Name1, dbo.KHKAdressen.Name2, dbo.KHKAdressen.LieferStrasse, dbo.KHKAdressen.LieferLand, dbo.KHKAdressen.LieferPLZ, dbo.KHKAdressen.LieferOrt
    FROM dbo.KHKAdressen
    where dbo.KHKAdressen.Referenz NOT IN
    (
    SELECT dbo.KHKAdressen.Referenz
    FROM dbo.KHKAdressen inner JOIN dbo.BCSPjmObjekte ON dbo.KHKAdressen.Adresse = dbo.BCSPjmObjekte.Adresse where dbo.BCSPjmObjekte.Objektnummer IN
    (SELECT BCSPjmObjekte.Objektnummer FROM BCSPjmObjekte Inner join dbo.BCSPjmObjekteZubehoer ON dbo.BCSPjmObjekte.Objektnummer = dbo.BCSPjmObjekteZubehoer.Objektnummer
    where dbo.BCSPjmObjekteZubehoer.Artikelnummer IN ('7711001242', '7711001050', '11000013'))
    )

  • #2
    Ohne das ich jetzt das genau angesehen habe

    where dbo.KHKAdressen.Referenz IN
    .....where dbo.BCSPjmObjekte.Objektnummer NOT IN
    Christian

    Comment


    • #3
      die Große Schwierigkeit ein kunde kann mehrere Objekte haben. Ich will aber nur die Kunden haben welche bei keinem seiner Objekte diese Artikel dabei haben. Objektnummer not in Filtert mir ja nur die "Objekte" raus wo dieses Zubehör nicht dabei ist. Ein Kunde welcher also 2 Objekte hat und bei einem das Zubehör fehlt wird mir auch ausgegeben

      Comment


      • #4
        Bist Du Dir sicher, dass Du das Datenmodell und seine Anwendung kennst? (Hier kennt es jedenfalls keiner, also bleiben nur Tabellen und Spaltennamen)

        Ich würde zunächst sagen: In der Logik Deiner Abfragen besitzen alle Adressen einfach das Zubehör. Aber es sind ja nicht immer die Abfragen, die falsch sind.

        Das Ganze hat natürlich einen Haken. Du bist mit dem Ergebnis unzufrieden und es sieht bei näherer Betrachtung auch etwas eigenartig aus.
        Was Du in Deinen Abfragen "beschreibst" ist
        - eine "Kundenmenge"
        - eine "Objektmenge"
        - eine "Zubehörmenge"

        Liefern diese Mengen tatsächlich die Informationen, die Du abfragen möchtest?
        Ich kenne es so, dass irgendwo auch eine "besitzanzeigende" Information hinterlegt ist oder wenigstens eine neutrale Zuordnung zwischen einer Gesamtmenge von Objekten und den Individuen, die über diese Objekte verfügen. Nennt man gern Bestellung oder Order oder sowas.
        Jetzt könnte man einwänden, es gibt doch einen funktionierenden(!) Join zwischen Objekten und Adressen, also ist die Abfrage ok. Dann würde ich entgegnen: es ist leider (besonders in MS SQL) üblich, Referenzen mit Autoincrementwerten zu bauen, die in jeder Tabelle gleich sind, so ergeben alle Selects, die diese Referenzen nutzen auch fast immer ein Ergebnis, egal, ob richtig oder falsch.

        Also hast Du:
        die falschen oder zu wenig Daten abgefragt?
        die Abfrage für die Veröffentlichung zu stark verändert, sodass die Semantik keine brauchbaren Schlussfolgerungen mehr erlaubt?
        das Modell hinter der Abfrage nicht verstanden?

        oder ich:
        habe das Modell nicht verstanden.

        Gruß, defo

        Comment


        • #5
          Hi, Mit NOT IN funktioniert das nicht.
          Habe jetzt nicht so die Muse, den genauen SQL Befehl zu schreiben, ich veranschauliche dir aber mal die Vorgehensweise.

          SELECT TableA.name,... FROM TableA LEFT JOIN TableB ON TableA.key = TableB.key WHERE TableB.key IS NULL;

          .key ist die jeweilige Verknüpfung mit der Tabelle.

          EDIT: NOT IN kann nicht Funktionierten, dass liegt an der Funktionsweise von Datenbanken.
          Zuletzt editiert von shadow73; 19.08.2020, 11:53.

          Comment


          • #6
            Warum sollte ein Key null sein?
            Bei einem left join werden nur die aus Tabelle B gezogen, die TableA.key = TableB.key erfüllen.
            Davon abgesehen, warum muss erst
            TableA.key = TableB.key
            (B.Key einen Wert haben) und dann
            TableB.key IS NULL
            sein

            EDIT
            EDIT: NOT IN kann nicht Funktionierten, dass liegt an der Funktionsweise von Datenbanken.
            Das ist seltsam gehört es doch zum Standard
            https://www.techonthenet.com/sql/not.php

            https://beginner-sql-tutorial.com/sql-not-in.htm
            Zuletzt editiert von Christian Marquardt; 19.08.2020, 14:54.
            Christian

            Comment


            • #7
              Hi, weil die Datenbank so arbietet.
              Durch das LEFT JOIN werden alle Einträge aufgeführt, die in Tabelle A sind, und zusätzlich auch in kombination mit Tabelle B. Inklusive (und darauf kommt es an die Einträge, die nicht auf Tabelle B Verweisen und somit ein NULL Erbebnis bei Tabelle B enthalten.

              Dadurch, dass du aber mit WHERE auf KEY IS NULL prüfst werden alle Kombinationen von Tabelle A im Bezug auf Tabelle B entfernt und es bleiben nur die Einträge von Tabelle A übrig, die keinen Bezug zu Tabelle B haben.

              EDIT: Du kannst dir also Vorstellen, dass du mit Join Left zuerst alle Daten hinzufügst und mit WHERE ein Filter anschaltest, der nur die relevanten übrig läst. Bei JOIN LEFT werden nämlich auch Einträge ausgewählt, wenn absolut keine Verknüpfung besteht, im Gegensatz zu INNER JOIN (NUR dann mit Tabelle B = NULL).
              Zuletzt editiert von shadow73; 25.08.2020, 10:34.

              Comment


              • #8
                Beispiel:

                TabelleA
                ID Name
                1 Manfred
                2 Gerhard
                3 Tomas

                TabelleB
                ID Krankheit ID_TabelleA
                1 Fußpilz 1
                2 Triefauge 1
                3 Alzheimer 3

                SELECT TabelleA.Name, TabelleB.Krankheit INNER JOIN TabelleB ON TabelleA.id = TabelleB.id_TabelleA;
                Manfred, Fußpilz
                Manfred, Triefauge
                Thomas, Alzheimer

                SELECT TabelleA.Name, TabelleB.Krankheit LEFT JOIN TabelleB ON TabelleA.id = TabelleB.id_TabelleA;
                Manfred, Fußpilz
                Manfred, Triefauge
                Gerhard, NULL
                Thomas, Alzheimer

                SELECT TabelleA.Name, TabelleB.Krankheit LEFT JOIN TabelleB ON TabelleA.id = TabelleB.id_TabelleA WHERE TabelleB.id IS NULL;
                Gerhard, NULL

                MfG

                Comment


                • #9
                  Ok, Danke.....
                  Christian

                  Comment


                  • #10
                    Ach ja, wegen dem Key gegen NULL testen.
                    Jede Spalte von Tabelle B ist in diesem Fall NULL, also kann ich auch Spalte "key" gegen NULL testen.

                    Comment


                    • #11
                      ja, das hatte ich übersehen
                      Christian

                      Comment

                      Working...
                      X