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



## tri2k (1. August 2005)

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.


----------



## Sapperlot (1. August 2005)

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


----------



## tri2k (1. August 2005)

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.


----------



## hpvw (1. August 2005)

Hier ein Versuch (MySQL > 4.1):
	
	
	



```
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)
```


----------



## Sapperlot (1. August 2005)

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


----------



## tri2k (1. August 2005)

@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


----------



## Sapperlot (1. August 2005)

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


----------



## hpvw (1. August 2005)

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:
	
	
	



```
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):
	
	
	



```
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


----------



## tri2k (1. August 2005)

@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


----------



## hpvw (1. August 2005)

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


----------



## Sapperlot (1. August 2005)

Mich hätte noch interessiert, für was man eine solche Auswertung braucht... Kann mir jetzt grad kein Konkretes Beispiel vorstellen...

Hatte noch nicht so intensiv mit DBs zu tun, wie man meinen Postings auch entnehmen kann ^^

Gruß, Basti


----------



## tri2k (1. August 2005)

@hpvw: 



> Und in einer Zeile kann Feld1 nunmal nur den Wert 12 oder den Wert 13 haben.



Das leuchtet ein.   

@sapperlot: 


> Mich hätte noch interessiert, für was man eine solche Auswertung braucht...



Ich benötige das für ne Suchabfrage, Mehrere Personen haben bestimmte Zustände. (im Beispiel waren das die Einträge bei Feld1.  Da die Zuordnung in der Tabelle bereits vorhanden ist, möcht ich nur darin suchen und nicht über eine verknüpfte Tabelle gehen. Ich arbeite auch nicht mit Namen (war nur fürs Beispiel),  sondern nur mit den IDs. 
Es muß möglich sein, nur Personen zu finden die mehrer gleiche Kriterien erfüllen, aber eben nur diese und nicht weniger. (ist für den medizinischen Bereich gedacht) Ob es mehrere gibt ist in dem Moment noch nicht bekannt. Kann aber sein, daß es in Zukunft auch Ausschlusskriterien geben wird. 
Da komm ich dann wieder auf das Forum hier zurück   

Ansonsten nochmal vielen Dank Euch beiden. Das ging ja wirklich schnell hier


----------

