Benutzer mit den meisten Antworten
SQL Abfrage

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
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
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
-
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 -
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 <> ''
-
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 -
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.
-
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