MSSQL: Suche nach verschiedene Werten in einem Feld (in einer Tabelle) mit UND

tri2k

Grünschnabel
Hallo,

Ich habe ein kleines Problem. Ich möchte aus einer Tabelle Datensätze bekommen, die mehrere Kriterien eines Feldes erfüllen.

Die Struktur der Tabelle sieht folgendermaßen aus:

ID | Feld1| Person
----------------------------
1 | 12 | Holger
2 | 12 | Stefan
3 | 13 | Franz
4 | 14 | Olaf
5 | 13 | Holger

Ich möchte jetzt eine Abfrage machen, die mir z.B. nur den Datensatz raussucht, der die Bedingung Feld1 = 12 und Feld1 = 13 erfüllt. , also Holger

Die ganze Sache mit ODER zu machen funktioniert:
(select * from tabelle where feld1 = 12 OR feld1 = 13)
(select * from tabelle where feld1 in (12, 13)
Dabei bekomm ich aber nicht die gewünschte Ergebnissmenge, sondern zu viel Einträge, ist ja auch klar.

Ich habe bisher noch keinen eleganten Weg gefunden meine Suche mit UND zu realisieren. Ich hoffe ihr könnt mir dabei helfen. Vielen Dank schonmal. :)
 
tri2k hat gesagt.:
Die ganze Sache mit ODER zu machen funktioniert:
(select * from tabelle where feld1 = 12 OR feld1 = 13)
(select * from tabelle where feld1 in (12, 13)
Dabei bekomm ich aber nicht die gewünschte Ergebnissmenge, sondern zu viel Einträge, ist ja auch klar.

Was bekommst denn raus wenn Du die ODER Abfrage machst?
Mit der solltest Du doch die Ergebnismenge zurückbekommen, die Du erwartest. Du befindest Dich ja wie gesagt in EINER Tabelle, und die Abfrage beschränkt sich doch auch auf DIESE EINE, oder?

ID | Feld1| Person
----------------------------
1 | 12 | Holger
2 | 12 | Stefan
3 | 13 | Franz
4 | 14 | Olaf
5 | 13 | Holger

Ich glaub ich seh jetzt was Du meinst...
Du bekommst
Holger, Stefan, Franz, Holger zurück.
Möchtest aber nur Holger, Stefan, Franz...

Falls es so sein sollte lautet die Antwort auf Deine Frage voraussichtilich:
select Person DISTINCT from tabelle where Feld 1 = 12 OR Feld 1 = 13;

Sag bescheid, ob es das war.

Gruß, basti
 
Zuletzt bearbeitet:
Also wenn ich ODER ausführe bekomme ich: Holger, Stefan, Franz, Holger
Mein Ziel ist aber nur Holger herauszubekommen.

Die Anfrage beschränkt sich nur auf die EINE Tabelle, das stimmt.
 
Hier ein Versuch (MySQL > 4.1):
Code:
SELECT * 
FROM tabelle AS t1
WHERE 2 <= (SELECT COUNT(*) 
  FROM tabelle AS t2
  WHERE t1.Person=t2.Person AND (
     t2.Feld1=12 
     OR t2.Feld1=13)
 
tri2k hat gesagt.:
Also wenn ich ODER ausführe bekomme ich: Holger, Stefan, Franz, Holger
Mein Ziel ist aber nur Holger herauszubekommen.

Die Anfrage beschränkt sich nur auf die EINE Tabelle, das stimmt.


Dann geht's wie folgt:
select DISTINCT Person from tabelle where Feld 1 = 12 OR Feld 1 = 13;

DISTINCT sorgt dafür, dass mehrfach vorkommende Felder zu einem Gruppiert werden, also Holger nur noch einmal vorkommt.

Sag bescheid, ob es das war.

Gruß, basti
 
@Sapperlot: Danke für die schnelle Antwort, doch leider meine ich das nicht so.
Mein Ergebnis soll nur Holger sein, da er ja die Bedingung Feld1 = 12 und Feld1 = 13 erfüllt. Die anderen dürfen nicht erscheine, die erfüllen ja nur eine Bedingung der beiden

@hpvw: Leider klappte Deine Abfrage nicht, ich bekomme dabei wieder alle Datensätze heraus
 
tri2k hat gesagt.:
@Sapperlot: Danke für die schnelle Antwort, doch leider meine ich das nicht so.
Mein Ergebnis soll nur Holger sein, da er ja die Bedingung Feld1 = 12 und Feld1 = 13 erfüllt. Die anderen dürfen nicht erscheine, die erfüllen ja nur eine Bedingung der beiden
Ach so...
Na dann musst halt den AND-Operator Benutzen.

select * from tabelle where Feld1 = 12 AND Feld1 = 13;
oder eben
select DISTINCT Person from tabelle where Feld1 = 12 AND Feld1 = 13;
Aber normal solltest doch selbst drauf gekommen sein. Ich mein, das steht ja schon in Deiner Toppic-Zeile...

Aber Moment... Ggf funktioniert das doch nicht.
Ich denk nochmal kurz nach...

Gruß, basti
 
Ich kann nicht mit MSSQL testen, sondern nur mit MySQL. Du musst das noch auf entsprechende MSSQL-Syntax umstellen.
Oben hatte ich eine Klammer vergessen.
Hier das getestete Query mit dem ich unter MySQL (Testtabelle personen) nur die beiden Zeilen mit "Holger" erhalte:
Code:
SELECT * 
FROM personen AS t1
WHERE 2 <= (SELECT COUNT(*) 
  FROM personen AS t2
  WHERE t1.Person=t2.Person AND (
     t2.Feld1=12 
     OR t2.Feld1=13)
)
Willst Du nur eine der beiden Zeilen, musst Du nach der Person gruppieren (wieder MySQL-Syntax):
Code:
SELECT * 
FROM personen AS t1
WHERE 2 <= (SELECT COUNT(*) 
  FROM personen AS t2
  WHERE t1.Person=t2.Person AND (
     t2.Feld1=12 
     OR t2.Feld1=13)
)
GROUP BY t1.Person
Gruß hpvw
 
@hpvw: jetzt funtkioniert es, wenns nur an der Klammer lag, habe ich mich wahrscheinlich vorhin beim testen verschrieben. Hatte auch mit den Klammern noch rumprobiert. Danke!
:)

@Sapperlot: Die Verknüpfung über das AND funktioniert leider nicht, das habe ich auch als erstes probiert, nen Bekannter hat mir dann auch erklärt, weshalb das so nicht gehen kann. Leider kann ich das hier nicht wiedergeben, hatte was mit der Umkehrfunktion von AND und OR zu tun.

Gruß
tri2k
 
Das es mit Und nicht funktioniert ist einfach: Ein Feld kann nicht gleichzeitig den Wert 12 und den Wert 13 haben. Die Datenbank prüft zeilenweise, ob diese Zeile ins Ergebnis aufgenommen wird. Und in einer Zeile kann Feld1 nunmal nur den Wert 12 oder den Wert 13 haben.

Gruß hpvw
 

Neue Beiträge

Zurück