Problem mit Sql Abfrage

Hallo

ich hoffe es kann mir einer helfen. Ich bin zwar nicht mehr ganz Laie was SQL Abfragen betrifft aber alle Tricks und Kniffe beherrsche ich noch nicht.

Ich habe folgendes Problem.

Ich habe eine Datenbanktabelle mit dem Spaltenaufbau

Nummer | Locus | Merkmal

zu jeder nummer können x-beliebige Datensätze in der Datenbank sein z.B

10 | A | 2
10 | A | 4
10 | B | 3
10 | C | 7

usw. zu jedem Locus können 0-2 Datensätze vorhanden sein. Das heisst eine Nummer hat keine Datensätze für A oder einen oder 2 das gleiche gilt für die anderen auch.

So jetzt möchte ich eine Abfrage auf diese Tabelle machen und zwar ist meine Ziel die Nummer rauszubekommen.
Beispielabfragen:
1 . Ich suche alle Nummern die ein A2 UND ein A4 haben UND zusätzlich ein B3
2. ich Suche alle Nummern die kein B3 haben

neuer Beispielblock

11 | A | 2
11 | A | 4
11 | B | 3
11 | B | 7
11 | C | 7

  1. Ich suche alle Nummern die ein A2 UND ein B7 haben
  2. Ich suche alle Nummern die ein A2 aber KEIN B7 haben

Das Problem bei der Abfrage ist mich interessieren vom Prinzip her nur die Datensätze mit A oder B aber da ich nicht genau weiss ob eine Nummer 0 1,2,3 oder alle 4 Datensätze hat ist es schwer einen vergleich herzustellen.

Desweiteren sind alle Datensätze Zeilen der gleichen Tabelle.

ich hatte eine Abfrage gebastelt die soweit auch gut funktioniert hat das Problem bei meiner Abfrage war das IMMER alle vier Sätze vorhanden sein müssen also 2 von A und 2 von B. Wenn jetzt eine Nummer z.B wie folgt aussieht

12 | A | 4
12 | B | 5
12 | B | 7

und man alle Nummern mit A 4 und A3 sucht sollte die Nummer 12 auch mit angezeigt werden hätte sie jetzt allerdings einen Datensatz mehr

12 | A | 4
12 | A | 8
12 | B | 5
12 | B | 7
so dürfe sie nur angezeigt werden wenn sie ein A3 und A4 hat.

Ich hoffe ihr könnt mein Problem nachvollziehen und mir helfen ich bin wirklich am verzweifeln .
Bitte helft mir O_O.

Gruß

Hi!

Ein paar Lösungansätze (kommt auf des RDBMS an)

  • Mehrfachverjoinung einer Tabelle mit Deinen Kriterien
    Oracle-like

    select distinct a.nummer from tab a, tab b, tab c …

  • Subselect(s) dieser einen Tabelle mit den Einschränkungen

    where exists

    where nummer (not) in

Und sicher gibt es noch einige Lösungsansätze mehr …

Grüße,
Tomh

Hi firestone,

1 . Ich suche alle Nummern die ein A2 UND ein A4 haben UND
zusätzlich ein B3

SELECT nummer FROM myTab WHERE locus = 'A' AND merkmal = '2'
INTERSECT
SELECT nummer FROM myTab WHERE locus = 'A' AND merkmal = '4'
INTERSECT
SELECT nummer FROM myTab WHERE locus = 'B' AND merkmal = '3';

Lies doch auch mal den Artikelbaum „SELECT mit WHERE ueber meherer rows“ ein wenig weiter unten: /t/select-mit-where-ueber-meherer-rows/4629222

  1. ich Suche alle Nummern die kein B3 haben
SELECT nummer FROM myTab o WHERE NOT EXISTS
 (SELECT \* FROM myTab i 
 WHERE i.nummer = o.nummer AND 
 i.locus = 'B' AND
 i.merkmal = 3);

11 | A | 2
11 | A | 4
11 | B | 3
11 | B | 7
11 | C | 7

  1. Ich suche alle Nummern die ein A2 UND ein B7 haben

Das ist das gleiche wie 1.

  1. Ich suche alle Nummern die ein A2 aber KEIN B7 haben

Das ist das gleiche wie 2., nur dass Du im äußeren SELECT auch noch einen Bedingung brauchst.

Ab hier verstehe ich allerdings nichts mehr und bin daher ganz und gar nicht sicher, ob ich Dein Problem überhaupt verstanden habe:

Das Problem bei der Abfrage ist mich interessieren vom Prinzip
her nur die Datensätze mit A oder B aber da ich nicht genau
weiss ob eine Nummer 0 1,2,3 oder alle 4 Datensätze hat ist es
schwer einen vergleich herzustellen.

Desweiteren sind alle Datensätze Zeilen der gleichen Tabelle.

ich hatte eine Abfrage gebastelt die soweit auch gut
funktioniert hat das Problem bei meiner Abfrage war das IMMER
alle vier Sätze vorhanden sein müssen also 2 von A und 2 von
B. Wenn jetzt eine Nummer z.B wie folgt aussieht

12 | A | 4
12 | B | 5
12 | B | 7

und man alle Nummern mit A 4 und A3 sucht sollte die Nummer 12
auch mit angezeigt werden

Warum? Es gibt doch A3 gar nicht(???). Ich verstehe einfach nicht worauf das hinausläuft.

hätte sie jetzt allerdings einen
Datensatz mehr

12 | A | 4
12 | A | 8
12 | B | 5
12 | B | 7
so dürfe sie nur angezeigt werden wenn sie ein A3 und A4 hat.

Soll es dann hier also angezeigt werden oder nicht? Und warum (schon oder eben nicht)?

Gruß
Martin

Hmmm

das Problem ist leider sehr schwer zu beschreiben.

Also die Beispieldaten die ich angegeben habe sind wirklich nur Beispiele in unserer Datenbank gibt es mehrer 100000 Sätze.

Also Aufbau eine Nummer kann 0-X Datensätze haben

davon haben 0-2 Sätze den Locus A und 0-2 Sätze den Locus B

nun muss ich eine Abfrage haben die mir die Möglichkeit bietet Nummern nach verschiedenen Kriterien abzufragen.

Dabei gibt es eine inklusive Suche und eine exklusive suche.

zum Beispiel suche ich alle nummern die ein A2 und A3 haben.

hat jetzt eine Nummer aber nur einen Satz mit A2 und der zweite A Locus Satz fehlt ihr soll diese Nummer trotzdem mit ausgegeben werden .

Hat eine Nummer aber zwei A Locus Sätze A2 und A5 gehört sie nicht in die Ergebnisliste.

Bei den Abfragen können 1-X Merkmale abgefragt werden also z.B.

alle Nummern die eine Kombination aus A1, A2 , A3 ,A4 besitzen.

Ich hoffe das war etwas veständlicher O_O ist sehr schwer zu beschreiben .

Im Prinzip brauche ich eine Möglichkeit um mehrere Zeilen der Tabelle miteinander zu verbinden dies muss aber dynamisch sein weil halt nicht jede Nummer wirklich 2 Sätze für A und B besitzt

Moin,

den Tipp mit joins auf die gleiche Tabelle hast ja schon bekommen und dies dürfte der ebste Weg sein! Allerdings wirst du bei den x verschiedneen Kriterien kaum mit einem SQL auskommen sondern wirst wohl mehrere basteln müssen.
Allerdings könntest du - falls du alles in einem Recordset brauchst - die verschiedenen Abfragen dann via union zusammenführen!

Siehr die einfach mal diese beiden Thematiken an, denn deine Logik dahinter schein eh zu komplex zu sein als das das alles bis ins Detail hier geklärt werden kann.

Bisschen sollst ja auch noch selbst denken ;o))

Gruß

Bernd

Hi,

das Problem ist leider sehr schwer zu beschreiben.

…aber ich glaub’ ich steig schön langsam durch. Zumindest bis hierher:

alle Nummern die eine Kombination aus A1, A2 , A3 ,A4
besitzen.

Ich dachte von Ax kann es immer nur 0-2 geben? Dann würde diese Abfrage also genau die ausgeben, die genau einen Satz mit A1 (oder A2 oder A3 oder A4) haben, oder? Und keine Nummern, die gar keinen Locus A haben und auch keine, die 2 Loci hat, weil es ja bei zweien nicht sein kann, dass es alle vier gibt. Liege ich noch richtig?

Falls ja, dann sinngemäß:

SELECT col1, COUNT(\*) 
 FROM myTab
 WHERE col2 IN ('A1', 'A2', 'A3', 'A4')
 GROUP BY col1
 HAVING COUNT(\*) = 1;

Ich hoffe das war etwas veständlicher O_O ist sehr schwer zu
beschreiben .

Ich weiß nicht, ob Du das öffentlich beschreiben kannst, aber vielleicht versuchst Du es einmal etwas konkreter, ich kann mir unter Nummer/Locus/Merkmal ebensowenig vorstellen wie unter den Ausprägungen in deinem Beispiel.
Vielleicht hilft es auch zu beschreiben, was die Abfrage bezwecken soll.

Im Prinzip brauche ich eine Möglichkeit um mehrere Zeilen der
Tabelle miteinander zu verbinden dies muss aber dynamisch sein
weil halt nicht jede Nummer wirklich 2 Sätze für A und B
besitzt

Ich habe den Eindruck, dass die Abfrage eher weniger das Problem ist - wenn ich einmal verstanden habe, was das Ganze tun soll…

Gruß
Martin