none
SQL Abfrage RRS feed

  • Frage

  • Guten Morgen zusammen,

    ich stehe heute irgendwie auf dem Schlauch und bräuchte bitte Hilfe :-)

    Ich habe eine Tabelle mit den Spalten Kunde, Bereich, Löschen.

    der Kunde in öfters vorkommen, da er in den unterschiedlichen Klassen ist.

    ich will jetzt nur die Kunden haben, die in jedem Bereich ein X bei Löschen haben, also in jedem Bereich bei sich gelöscht sind. Ist eine Klasse nicht gelöscht, soll er nicht ausgewählt werden.

    Ich habe hier mal was gebastelt. Die grünen Felder will ich dann haben. Ich weiß jetzt aber nicht wie ich die Afrage machen soll.

    Könnt ihr mir helfen?

    Wäre super.

    Danke - VG Daniel


    • Bearbeitet DanWe1 Freitag, 31. Mai 2019 08:42 Änderung Text
    Freitag, 31. Mai 2019 07:35

Antworten

  • ich will jetzt nur die Kunden haben, die in jeder Klasse ein X bei löschen haben, also in jeder Klasse bei sich gelöscht sind. Ist eine Klasse nicht gelöscht, soll er nicht ausgewählt werden

    Der letzte Satz gibt eigentlich schon den einfachsten Weg an wie du das erreichen kannst: Lösche alle Kunden, bis auf die, die noch einen nicht gelöschten Eintrag haben.

    declare @tabelle table (Kunde int, Bereich int, Loeschen bit);
    insert into @tabelle (Kunde, Bereich, Loeschen) values 
    (1, 49, 0), (1, 50, 1), (1, 51, 0), (2, 50, 1), (2, 51, 1),
    (3, 49, 0), (3, 50, 0), (4, 49, 1), (4, 50, 0), (5, 51, 1);
    
    delete from @tabelle where Kunde not in (select Kunde from @tabelle where Loeschen = 0);

    • Als Antwort markiert DanWe1 Freitag, 31. Mai 2019 08:51
    Freitag, 31. Mai 2019 08:44

Alle Antworten

  • ich will jetzt nur die Kunden haben, die in jeder Klasse ein X bei löschen haben, also in jeder Klasse bei sich gelöscht sind. Ist eine Klasse nicht gelöscht, soll er nicht ausgewählt werden

    Der letzte Satz gibt eigentlich schon den einfachsten Weg an wie du das erreichen kannst: Lösche alle Kunden, bis auf die, die noch einen nicht gelöschten Eintrag haben.

    declare @tabelle table (Kunde int, Bereich int, Loeschen bit);
    insert into @tabelle (Kunde, Bereich, Loeschen) values 
    (1, 49, 0), (1, 50, 1), (1, 51, 0), (2, 50, 1), (2, 51, 1),
    (3, 49, 0), (3, 50, 0), (4, 49, 1), (4, 50, 0), (5, 51, 1);
    
    delete from @tabelle where Kunde not in (select Kunde from @tabelle where Loeschen = 0);

    • Als Antwort markiert DanWe1 Freitag, 31. Mai 2019 08:51
    Freitag, 31. Mai 2019 08:44
  • super Vielen Dank.
    Freitag, 31. Mai 2019 08:51
  • Hallo Daniel,

    so auf den ersten Blick würde es wohl ausreichen, einfach alle Datensätze mit Kundennummern zu ermitteln, die nicht mind. einmal mit Löschen = '' vorkommen.

    SELECT ...
    FROM   Tabelle
    WHERE  Kunde NOT IN (
                         SELECT Kunde
                         FROM   Tabelle
                         WHERE  Löschen = ''
                        )

    HTH

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Freitag, 31. Mai 2019 08:52
    Moderator
  • Wofür gibts eigentlich die Exists-Klausel?

    delete 
    FROM   Tabelle a
    WHERE  exists (SELECT * FROM   Kunde b
                    WHERE a.kunde = b.kunde and  a.Löschen <> ''
                        )

    Und für diesen SQL gibts eine Abkürzung:

    SELECT ...
    FROM   Tabelle
    WHERE  Kunde NOT IN (
                         SELECT Kunde
                         FROM   Tabelle
                         WHERE  Löschen = ''
                        )

    Entspricht:

    SELECT ... FROM Tabelle WHERE Löschen <> ''

    Sonntag, 2. Juni 2019 11:15
  • Hi,

    nö, dein Statement hat mit meinem nichts zu tun. Der OP will ja alle Datensätze zu Kunden, bei denen Löschen nie mit '' vorkommt.

    Kunde     Bereich   Löschen
    ---------------------------
    Kunde1    1         x
    Kunde1    2         
    ---------------------------
    Kunde2    1         x
    Kunde2    2         x
    ---------------------------
    
    Ergebnis:
    
    Kunde     Bereich   Löschen
    ---------------------------
    Kunde2    1         x
    Kunde2    2         x
    ---------------------------

    Dein Beispiel würde sowohl den ersten DS von Kunde1 als auch die beiden von Kunde2 liefern. Das ist aber nicht gewünscht.



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Sonntag, 2. Juni 2019 11:30
    Moderator
  • SELECT ...
    FROM   Tabelle
    WHERE  Kunde NOT IN (
                         SELECT Kunde
                         FROM   Tabelle
                         WHERE  Löschen = ''
                        )

    Warum soll ich "Tabelle" mit sich selbst "Tabelle" verknüpfen?
    Dann ist das ggf. ein Tippfehler;-) und gemeint ist:

    SELECT ...
    FROM   Tabelle1
    WHERE  Kunde NOT IN (
                         SELECT Kunde
                         FROM   Tabelle2
                         WHERE  Löschen = ''
                        )

    Wobei eben "not in" auch mit "not exists" oder dem Gegenteil "exists ... where loeschen <> '' " ausgetauscht werden kann, da ein Indexzugriff meist schneller als eine "in"-Select-Liste ist.

    Sonntag, 2. Juni 2019 12:16
  • Hi,

    lass es doch einfach. Das ist kein Tippfehler und entspricht dem, was der OP wollte. Wenn Du dir die Mühe machen würdest, das mal mit dem Testdaten auszuprobieren, wüsstest Du, wo der Unterschied liegt.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Montag, 3. Juni 2019 07:54
    Moderator