Bölk: Verweiste Referenzen

Hallo!

Folgendes Problem(SQL Server):
Ich möchte mir alle Datensätze einer Tabelle ansehen, zu denen es keine Referenz mehr zur Beziehungstabelle Besteht.

Beispiel:
3 Tabelle: Kunde, Rechnung und Beziehungstabelle.
In der Beziehungstabelle sind die Positionen zw. RechnungsID und KundenID gespeichert. Wir davon aus, dass in der Beziehungstabelle  "updates" auf Positionen stattfinden können.

Wie kann ich nun Kunden finden, die nicht in der Beziehungstabelle "geführt" sind.

Ich weiss, die Frage ist schon fast lächerlich einfach aber momentan hab ich Gehirnblockade.

Folgendes versucht:
1)
SELECT Kunde FROM KundenTabelle WHERE NOT EXISTS
(SELECT DISTINCT Kunde FROM Beziehungstabelle)

SELECT COUNT(K.Kunde) AS Anzahl, K.KundeFROM KundenTabelle AS K
LEFT OUTER JOIN Beziehungstabelle AS B ON B.Kunde = K.Kunde
GROUP BY (K.Kunde)ORDER BY Anzahl

  1. Ach ja...

    SELECT COUNT(K.Kunde) AS Anzahl, K.Kunde FROM KundenTabelle AS K
    LEFT OUTER JOIN Beziehungstabelle AS B ON B.Kunde = K.Kunde
    GROUP BY (K.Kunde)ORDER BY Anzahl

    Hierbei wollte ich dann über die Anzahl gehen, also bei "Anzahl = 1" gibts den Kunden nur in der KundenTabelle ist aber auch irgendwie ne Krücke.

  2. yo,

    Ich möchte mir alle Datensätze einer Tabelle ansehen, zu denen es keine Referenz mehr zur Beziehungstabelle Besteht.

    foreign keys sind genau für diesen fall gedacht. grundsätzlich ist es möglich, dass wenn ein datensatz aus einer tabelle (z.b. Kunde) gelöscht wird, alle auf in verweisenden datensätze(beziehungstabelle) automatisch mitgelöscht werden. bin mir aber nicht genau sicher ob mysql das macht und wenn ja ab welcher version.

    noch ein weitere tipp, ich würde kunden nicht löschen, sondern nur durch eine spalte auf aktiv und passiv setzen.

    Wie kann ich nun Kunden finden, die nicht in der Beziehungstabelle "geführt" sind.

    SELECT kundennr
    FROM kunden AS k LEFT JOIN beziehungstabelle AS b ON (k.kundennr=b.kundennr)
    WHERE b.kundennr IS NULL;

    Ilja

    1. Moin!

      mysql das macht und wenn ja ab welcher version.

      Wie ich schrieb: (MS) SQL Server (2000)

      noch ein weitere tipp, ich würde kunden nicht löschen, sondern nur durch eine spalte auf aktiv und passiv setzen.

      Muss weg da dieser Eintrag nie mehr gebraucht wird!

      ...
      WHERE b.kundennr IS NULL;

      Ich hab gewusst das es so simpel ist... vielen Dank Ilja

  3. Hallo,

    Ich hab schon lange nichts mehr mit dem SQL Server getan, aber ich versuche mal einieg Statements (BTW: für den Insider wäre die Version noch interessant, da kann es nämlich erhebliche Unterschiede in der Syntax geben)

    Folgendes versucht:
    1)
    SELECT Kunde FROM KundenTabelle WHERE NOT EXISTS
    (SELECT DISTINCT Kunde FROM Beziehungstabelle)

    SELECT Kunde from KundenTabelle
     WHERE Kunde NOT IN ( SELECT DISTINCT Kunde FROM BEziehungsTabelle)

    SELECT COUNT(K.Kunde) AS Anzahl, K.KundeFROM KundenTabelle AS K
    LEFT OUTER JOIN Beziehungstabelle AS B ON B.Kunde = K.Kunde
    GROUP BY (K.Kunde)ORDER BY Anzahl

    SELECT COUNT(K.Kunde) AS Anzahl, K.Kunde
      FROM KundenTabelle AS K
      LEFT OUTER JOIN Beziehungstabelle AS B ON B.Kunde = K.Kunde
      GROUP BY (K.Kunde)
      HAVING Anzahl = 0

    Grüße
      Klaus