MySQL - Teilmenge von Gesamtmenge abziehen mit 'NOT IN'-Abfrage funktioniert nicht

user0210

Grünschnabel
Hallo, ich habe folgendes Problem (sehr vereinfacht):

Tabelle 'test':

id | subid | bedingung
-------------------------------
10 | 1 | ab
10| 2 | 1
20| 1 | cd
20 | 2 | ef
20 | 3 | 2
30 | 1 | 1

Jetzt möchte ich alle id,subid (ergibt zusammen den Primärschlüssel) von den Datensätzen wo die Datensätze ungleich "1" sind.

Die gesuchte Ergebnismenge ist also:
id | subid
---------
10 | 1
20| 1
20 | 2
20 | 3


Da das Beispiel stark vereinfacht ist, habe ich hier bereits das Feld "bedingung" für jeden Datensatz beispielhaft ausgefüllt. Im Realbeispiel muss ich allerdings mehrere Tabellen auswerten um auf die Bedingung zu gelangen. Von daher kommt folgende Abfrage nicht in Frage (!!):
Code:
 SELECT id,subid FROM test WHERE bedingung != 1;

Da ich über einen komplizierten Abfragemarathon nur auswerten kann ob 'bedingung = 1', ist es mir möglich die Anfrage (für das Beispiel vereinfacht) zustellen:
Code:
 SELECT id,subid FROM test WHERE bedingung = 1;

Rein vom Logischen müsste ich jetzt nur die Abfrage:
Code:
 SELECT id,subid FROM test WHERE (id,subid) NOT IN (SELECT id,subid FROM test WHERE bedingung = 1) ;
stellen. Allerdings liefert diese mir zu viele Ergebnisse zurück!

Ich denke das Problem liegt daran das 'id' und 'subid' verglichen werden müssen und da was schief geht. Ich habe in vielen SQL Referenzen immer nur das Beispiel:
Code:
 ... WHERE (id) NOT IN (SELECT id FROM ...) ;
gefunden. Wenn nur ein Wert verglichen wird, klappt es ohne Probleme.

Vielleicht gehe ich aber falsch an die Sache ran. Eventuell gibt es einen JOIN oder eine andere Klausel die eine Teilmenge aus der Gesamtmenge "herausschneidet".

Ich hoffe das war jetzt nicht zu unverständlich :) Ich warte auf Rat.

Grüße
User
 
Hi,

teste mal Deinen Subselect getrennt, ob der auch wirklich genau das liefert, was Du erwartest. Eigentlich müsste das funktionieren. Zumindest funktioniert bei mir ein einfaches Beispiel. Probleme gibt es bei NULL-Werten in den Spalten. Check das einfach mal.

LG
 
Also den Subselect hat ich ja als erstes gebaut, der funktioniert genau richtig. Vielleicht hab ich aber noch was anderes übersehen :confused:

Könnte mir eventuell jemand eine äquivalente Konstruktion nennen, es führen ja bekanntlich mehrere nach Rom. Vielleicht könnte ich es dann ja über den Weg probieren. Manchmal steckt der Teufel ja im Detail und auf 'ne andere Art klappt es plötzlich auf Anhieb.

Hab die letzten 2 Tage nach 'ner anderen Möglichkeit gesucht, bin aber nicht fündig geworden ...

Bin weiterhin für Vorschläge & Anmerkungen offen!
 
Zurück