SELECT aus drei Tabellen (etwas komplex)

dayton

Grünschnabel
Hallo Leute,

ich möchte gerne ein Rezeptbuch schreiben welches anhand von Daten aus drei Tabellen die Rezeptvorschläge ertsellt.

In der ersten Tabelle stehen meine Rezepte mit den dazugehörigen Daten wie: ID, Name, Beschreibung, ...
In der zweiten Tabelle stehen die im Bestand vorhandene Produkte mit den Daten:
ProduktId, Produktname, vorhandene Menge (in Gramm).
In der dritten Tabelle stehen die Rezeptzutaten in Form von: RezeptId, ProduktId,
benötigte Menge (in Gramm).

Es werden pro Rezept mehrere Zeilen in der Zutaten Tabelle abgelegt.

Unser Problem besteht darin, das wir REZEPTE auswählen möchten, dessen ALLE Zutaten
vorhanden sind und von der Menge zum Zubereiten ausreichen. Also alle Zutaten, die in diesem Rezept vorkommen und
nicht ALLE überhaupt.

Schwierigkeit dabei ist, dass wir vorab nicht wissen, wie viele Zutaten ein Rezept hat (oder soll ich diese Info zusätzlich beim Rezept speichern? -> Datenredundanz!)

CREATE TABLE produkte (
1nprodukt_id SMALLINT NOT NULL,
1ngewicht SMALLINT NOT NULL);

INSERT INTO produkte (1nprodukt_id, 1ngewicht)
VALUES

( 17, 800),
( 45, 100),
( 48, 90),
( 79, 500),
( 53, 50),
( 44, 80),
( 36, 50),
( 94, 20),
( 90, 150),
( 82, 400),
( 62, 200),
( 62, 150),
( 9, 80),
(149, 80),
(112, 300),
(112, 250),
(124, 80),
(146, 80),
(148, 80),
(101, 10);

CREATE TABLE rezeptbuch (
6nrezept_id SMALLINT NOT NULL,
6cname VARCHAR2(40) NOT NULL);

INSERT INTO rezeptbuch (6nrezept_id, 6cname)
VALUES

( 1, '3 Minuten Brot'),
( 2, 'Bagels'),
( 3, 'Birnenkuchen'),
( 4, 'Kirschkuchen'),
( 5, 'Krümelkuchen'),

( 6, 'Apfel-Lachsragout'),
( 7, 'Fisch nach Art von Spetses'),
( 8, 'Karpfen nach Dresdner Art'),
( 9, 'Karpfen');

CREATE TABLE rezeptbestand (
3nrezept_id SMALLINT NOT NULL,
3nprodukt_id SMALLINT NOT NULL,
3nmenge SMALLINT NOT NULL);

INSERT INTO rezeptbestand (3nrezept_id, 3nprodukt_id, 3nmenge)
VALUES

( 1, 149, 20),
( 1, 112, 500),
( 1, 101, 6),
( 1, 90, 24),

( 2, 112, 60),
( 2, 149, 60),
( 2, 124, 50),
( 2, 9, 60),
( 2, 146, 60),
( 2, 101, 1),
( 2, 148, 10),

( 3, 9, 33),
( 3, 146, 41),
( 3, 112, 45),
( 3, 147, 1),
( 3, 124, 6),
( 3, 148, 50),
( 3, 131, 100),
( 3, 135, 10),
( 3, 143, 50),

( 4, 132, 60),
( 4, 148, 20),
( 4, 126, 25),
( 4, 115, 16),
( 4, 146, 4),
( 4, 105, 1),
( 4, 151, 4),

( 5, 151, 50),
( 5, 112, 200),
( 5, 147, 3),
( 5, 148, 70),
( 5, 146, 150),
( 5, 10, 150),
( 5, 129, 500),

( 6, 18, 200),
( 6, 135, 40),
( 6, 129, 80),
( 6, 60, 20),
( 6, 9, 10),
( 6, 126, 50),
( 6, 52, 10),

( 7, 17, 250),
( 7, 57, 150),
( 7, 135, 10),
( 7, 103, 5),
( 7, 43, 5),
( 7, 94, 5),
( 7, 13, 16),

( 8, 17, 200),
( 8, 45, 80),
( 8, 48, 80),
( 8, 79, 100),

( 9, 17, 100),
( 9, 45, 20),
( 9, 53, 3),
( 9, 44, 3),
( 9, 36, 10),
( 9, 48, 10),
( 9, 94, 10),
( 9, 90, 6),
( 9, 82, 7),
( 9, 62, 7),
( 9, 9, 1);

Der Datenbestand ist so aufgebaut, dass die Rezepte Nr. 1, 2, 8, 9 alles nötige zum Zubereiten haben.

Benötige dringend HILFEEE !
 
Ich gehe mal davon aus, dass du (wie beschrieben) mit Menge und Gewicht das gleiche willst...
So müsste es demnach funkionieren:
Code:
SELECT RBuch.6nrezept_id, RBuch.6cname FROM rezeptbuch RBuch WHERE 
(SELECT COUNT(*) FROM rezeptbestand 
WHERE RBuch.6nrezept_id=RBest.3nrezept_id)
=
(SELECT COUNT(*) FROM rezeptbestand RBest INNER JOIN produkte Prod 
ON Prod.1nprodukt_id=RBest.3nprodukt_id 
WHERE RBuch.6nrezept_id=RBest.3nrezept_id
AND Prod.1ngewicht>=RBest.3nmenge)
Das Select gibt (theoretisch - hab's nicht ausprobiert) alle Rezeptbuch-Einträge 'raus, deren Anzahl an benötigten Produkten der Anzahl der benötigten Produkte mit genügend Vorrat entspricht.:)
 
WOW!
Das war STARK!

Sogar unser DB Professor labert Allgemeinworte und kann nix konkretes sagen.
Select gibt mir 2 meine Rezepte nicht zurück, obwohl alle Produkte vorhanden sind, ansonsten ist es das, was ich seit paar Tagen suche! Die 2 Rezepte checke ich gleich, kann auch ein Denkfehler von mir sein!

Auf jeden Fall DANKE!

Das Alles brauche ich für meine Diplomarbeit, die bringt mich auch noch um! Kann ich zur Not deine E-Mail haben?
 
Freut mich, dir helfen zu können.:)
Für direkte Fragen kannst du mir auch eine Private Nachricht schicken.
Ich bin oft genug hier online.
Aber wenn das schon die schwiereigste Nuss war, die zu knacken ist, sollte ich vielleicht doch auch mal meinen Diplom machen.:-)
 
Alles klar ich weiß Bescheid. Nein es war nicht die schwierigste Nuß, es war nur ein Bereich, der nicht unbedingt zu meinen Stärken gehört. :-)

cu soon
 
Zurück