Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Abfrage nur erfolgreich wenn alle Werte aus Bedingung vorhanden

Begonnen von Halwin, Dezember 06, 2012, 17:29:35

⏪ vorheriges - nächstes ⏩

Halwin

Hallo zusammen,

ich stehe grad auf dem Schlauch.

Habe eine Tabelle in der Unternehmen stehen, die Produkte herstellen. Auf diese Tabelle möchte ich nun eine Abfrage setzen, die alle Unternehmen zurück liefert, die Schokolade (ProduktId 1) und Pudding (ProduktId 2) herstellen.

Die Tabelle enthält die unter anderem die Splaten Uid und ProduktId.

Es sollen aber im Ergebnis nur die Unternehmen angezeigt werden, die Schokolade UND Pudding produzieren.

Gibt es da eine Bedingung die direkt das richtige Ergebnis bringt oder muss ich mir da etwas wie eine Zwischenabfrage "basteln" die z.B. die Id's summiert und dann mit der Summe der Id's vergleicht, die ich als Filter übergeben habe?

Ich hoffe ich habe mich einigermaßen verständlich ausgedrückt  ???

Lieben Gruß
Halwin

DF6GL

Hallo,

es fehlt eine Tabelle ("tbl_UnternehmenProdukte") , die eine Zuordnung von Produkten zu einem Unternehmen herstellt.



Zitatdie Schokolade UND Pudding produzieren

ist mit lediglich einer Tabelle "tbl_Unternehmen" nicht abbildbar und somit nicht auszuwerten.

Halwin

ich wusste ich habe vergessen was zu erklären :(

Ich habe natürlich eine Tabelle Unternhemen in der gibt es u.a. uid und Name der Firma, Dann habe ich eine Tabelle Produkte. Da stehen die ProduktId und der Name des Produktes drin. die Dritte Tabelle enthält die Zuordnung von Unternehmen zu Produkt. Angenommen ich habe 2 Unternehmen und 4 Produkte. In der Zuordnung steht

UidProdId
11
12
13
22
23
24

select distinct uid from zuordnung where uid =3 liefert demnach 2 Zeilen. Eine mit uid 1 und eine mit uid 2.

wie sieht aber das statement aus wenn ich alle uid's haben will die 1 UND 2 als ProdId haben. Also nur Ergebnis liefern wenn auch beide ProdId's zum gleichen Unternehmen in der Tabelle sind!

Mit in(1,2) geht's nicht, weil das ja entweder oder  bedeutet.

Geht das immer noch einfach mit der Zwischetabelle? Und wenn ja, wie???

Beaker s.a.

Hallo Halwin,
ZitatMit in(1,2) geht's nicht, weil das ja entweder oder  bedeutet.
Genau, denn Schokolade kann kein Pudding sein (UND).
Versuch's mal mit ODER
... WHERE ProdID = 1 OR ProdID = 2
Datenbanklogik  ;D
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Halwin

uhhh da muss ich dich korrigieren
select distinct uid from zuordnung where prodId = 1 or prodId = 2 liefert in meinem beispiel 2 Zeilen zurück

Unternehmen 1 hat Schokolade (1) UND Pudding (2)
Unternehmen 2 NUR Pudding(2)

Ich will aber nur die Unternehmen als Ergebnis, die Schoki UND Pudding haben. Das geht mit einer einfachen OR Bedingung nicht. Bin ich da auf dem Holzweg ;)

Datenbanklogik   ;D

Gruß Olli

PS im statement im vorigen post von mir muss es natürlich ProdId und nicht Uid in der where Bedingung heißen... shame on me ;)

DF6GL

#5
Hallo,



z. B.:

Select tbl_Unternehmen.U_Name
From (tbl_Zuordnung INNER JOIN tbl_Unternehmen ON tbl_Zuordnung.UP_UID = tbl_Unternehmen.UID) INNER JOIN tbl_Produkte ON tbl_Zuordnung.UP_ProdID = tbl_Produkte.Prodid
Where tbl_Zuordnung.UP_ProdID=1 Or tbl_Zuordnung.UP_ProdID=2
Group by tbl_Unternehmen.U_Name, tbl_Zuordnung.UP_ProdID
Having  Count(*)=2

Beaker s.a.

Hallo Halwin,
Sorry, zu flüchtig gelesen.
Franz Lösung sollte aber passen (nicht getestet).
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Halwin

Hi,

der Vorschlag von Franz sieht sehr gut aus. Werd ich gleich mal ausprobieren.

Danke

Halwin

feedback:

Die Abfrage funktioniert  so leider nicht. Habe sie etwas umgestalltet und mich an einem Beispier orientier, das ich woanders gefunden hatte...

SELECT tblNV.*, tblSV.*,
-((tblNV.fld1=tblSV.fld1) + (tblNV.fld2=tblSV.fld2) + (tblNV.fld3=tblSV.fld3)  + (tblNV.fld4=tblSV.fld4)) AS MatchCount
FROM tblNV, tblSV;

Jetzt muss man nur noch eine Where-Bedingung dran basteln die da heißt:

where MatchCount = (Anzahl Tabellen in From) -1  bzw. = 1 wenn es nur eine Tabelle ist

DF6GL

Hallo, 


was genau funktioniert an meiner Version nicht?


Dein Beispiel kommt mir (jedenfalls) sehr suspekt vor...  ;)


PS: sehe gerade darin noch die Angabe eines falschen Tabellenamens.. Habe mein Posting dahingehend korrigiert.