SQL Verschachtelte SQL Abfrage

  • Ersteller Ersteller Tomson
  • Erstellt am Erstellt am
T

Tomson

Gast
Moin Moin,

Ich sitze nun seit mehr als 3 Tagen an einer SQL-Abfrage und stehe irgendwie auf dem Schlauch...

Gegeben habe ich 3 Tabellen. Eine Tabelle "Raum", in der spezielle Raumeigenschaften wie Größe und Ansprechpartner eingetragen sind, eine Tabelle "Attribute" in der verschiedene Gegenstände aufgelistet sind, die in einem Raum enthalten sein können. (Beamer, Flipchart etc.) (Beide haben hochzählende IDs)

Und eine Tabelle "Rauminhalt" in der nach folgendem Muster die Daten verknüpft werden (Siehe Anhang 'tabelle_rauminhalt.jpg')

einer RID (Raumid) wird eine AID (Attributid) zugeordnet (und eine bestimmte Anzahl, die jedoch für die Suche nicht weiter von Bedeutung ist)

Es geht nun darum in einer erweiterten Suche alle RaumIDs auszugeben, die die in einer Checkbox markierten Attribute enthalten...

Dazu hatte ich mir folgendes ausgedacht(was leider nicht funzt :lol: ):

Code:
SELECT 
T_RV_Raum.RID, T_RV_Raum.RName, T_OIC_Auswahl_Firma.Firma, T_OIC_Auswahl_Firma.WERK 
 
FROM 
 
(SELECT  T_RV_Raum.RID, T_RV_Raum.RName, T_OIC_Auswahl_Firma.Firma, T_OIC_Auswahl_Firma.WERK FROM T_RV_Raum INNER JOIN T_OIC_Auswahl_Firma ON T_RV_Raum.RFirmaID = T_OIC_Auswahl_Firma.pkey 
 
WHERE T_RV_Rauminhalt.AID = @AID)
 
WHERE @rid_count = @anzahl_items

Die Idee dahinter ist, dass er 2 Selects verschachteln soll, wobei das erste Select alle Datensätze zurückliefern soll, die eins der angewählten Attribute im AID Feld enthalten und das zweite Select alle zurückgegebenen Werte des Ersten selects prüfen soll, ob eine RaumID so oft vorhanden ist, wie die gesamtanzahl der angewählten Attribute...

Ich hoffe es war verständlich :)

Gruß,
Tommi
 

Anhänge

  • tabelle_rauminhalt.jpg
    tabelle_rauminhalt.jpg
    31,2 KB · Aufrufe: 255
poste doch mal ein ERM, damit wir verstehen was du eigentlich willst... zumindestens versteh ich micht was du genau willst.
 
Zumal in der Abfrage mehr Tabellen auftauchen als du angesprochen hast.


Entity Relationship Model

Ist das erste was man (in der Schule, oder wo auch immer) lernt, wenn man Datenbanken entwirft. Gibt auch noch das ERD (Entity Relationship Diagram). Konnte beide nie wirklich auseinander halten. Im einen sind aber nur die Tabellen und ihre Verknüpfung. Im anderen gibst du noch die Inhalte (Schlüssel, etc) der Tabellen und die Kardinalitäten an.
 
Zuletzt bearbeitet:
Entity relationship modell... einfacher zu verstehen als der Text... bin nicht der wortgewanteste...
 
Die 4. Tabelle ist für die eigentliche Abfrage nicht relevant, daher habe ich sie nicht mit erläutert... (Sie dient nur dazu, die Firma und das Werk abzufragen, darum geht es allerdings erstmal nicht ;) )
 
ich verstehe auch nicht was du meinst,

aber ich glaube mit inner join kommst du da weiter
 
Kenn mich jetzt ned so gut mit SQL aus, aber 2x WHERE? Sollte man die nicht mit AND verknüpfen?


Edit: Uups, hab die Klammer hinter dem ersten WHERE gar ned gesehn :)
 
Zuletzt bearbeitet:
@PARA:
Jain... Der eine Select muss ja abgeschlossen sein, damit der 2. auf die Daten zugreifen kann... mit AND würde das ja gleichzeitig passieren...

@S.D.W
Hmm... *nachdenk* weiß nicht so recht, wie ich es sonst beschreiben soll... Wie erstelle ich denn so ein ERM?
 
Kenn mich jetzt ned so gut mit SQL aus, aber 2x WHERE? Sollte man die nicht mit AND verknüpfen?

Ja das liegt der Hund begraben. Ist ein zweites SELECT wo das WHERE drin steht!
 
Richtig ^^

EDITED:

Meint ihr mit ERM sowas? (Anhang)
 

Anhänge

  • tabellen.jpg
    tabellen.jpg
    44,7 KB · Aufrufe: 228
Zuletzt bearbeitet:
ja, so in etwa schaut ein ERM aus. ich schau's mir mal an...
 
So schaut übrigens die Suchmaske aus (Anhang). Es geht darum, in dieser Raumsuche alle RaumIDs zu finden, die alle angewählten Gegenstände / Attribute besitzen...

Vielleicht wirds jetzt deutlich ;)
 

Anhänge

  • suchmaske.jpg
    suchmaske.jpg
    41,1 KB · Aufrufe: 226
hab hier grad viel zu tun, ich poste heute nachmittag ne lösung...
 
Danke schonmal... ich versuchs unterdessen mal weiter ;)
 
Zuletzt bearbeitet:
Code:
SELECT Raum_ID
FROM Tabelle_Raum AS R

INNER JOIN Tabelle_Raum_Inhalt AS RI
ON R.PK = RI.FK

INNER JOIN Tabelle_Raum_Attribut AS RA
ON RA.PK = RI.FK

WHERE RA.PK IN (1,2,3)

noch fragen? (1,2,3) ist deine aufzählung von der html seite
PK = primary key
FK = foreign key

hab mal bissel andere bezeihnung genommen, sollte aber verständlich sein ;)
 
Ohne jetzt von meiner Seite aus eine präzise Lösung präsentieren zu können, sieht das von ManOki ganz verständlich und logisch aus. So wäre auch mein erster Ansatz bzw. Gedankengang gewesen. Die Verschachtelung ist hier glaube ich nicht nötig.

Wie war das mit den Kanonen und Spatzen doch gleich? :-P
 
Erstmal schonmal ein danke an alle bisher Beteiligten.

@ Manoki: Ich hab jetzt mal deinen Code genommen, und versucht die "Variablen" mal durch meine Namen auszutauschen...

Code:
SELECT rid FROM T_RV_Raum AS R
INNER JOIN T_RV_Rauminhalt AS RI ON R.RID = RI.RID

INNER JOIN T_RV_Attribute AS RA ON RA.AID = RI.AID

WHERE RA.AID IN (1,2,3)

Allerdings bekomme ich immer folgenden Error (Anhang), finde aber den Fehler nicht :( (Sorry, habe noch nicht allzuviel Erfahrung mit Datenbanken und mittlerweile habe ich nen ordentlich Knoten im Hirn :freak:)
 

Anhänge

  • fehlermeldung.jpg
    fehlermeldung.jpg
    67,3 KB · Aufrufe: 238
Wie heißen deine Primärschlüssel in den Tabellen? Sicher nicht beide RID oder? Daran liegt es jedenfalls!

Code:
SELECT rid FROM T_RV_Raum AS R
INNER JOIN T_RV_Rauminhalt AS RI ON R.[B]RID [/B]= RI.[B]RID[/B]

INNER JOIN T_RV_Attribute AS RA ON RA.AID = RI.AID

WHERE RA.AID IN (1,2,3)

Und da kann ich mich auch schon selbst verbessern... wie dämlich! Hab im Screenie jedenfalls gesehen, dass beide Tabellen eine Spalte RID haben. Daran liegt es dann also nicht. Aber du solltest bei der ausgewählten Spalte (hinter dem Select) mal noch einen Tabellennamen hinzufügen (R.RID oder RI.RID).
 
Zuletzt bearbeitet:
Aber ich kann doch nicht Äpfel und Birnen miteinander Joinen? ôO

Der PK der einen Tabelle heißt Pkey und ist hochzählend (Liegt mittlerweile bei 160 oder so) die RaumIDs sind in beiden vorhanden und bei einem ist die RID der PK :freak:

EDITED:
Das mit dem Tabellennamen hatte ich direkt versucht, nachdem ich die Fehlermeldung hatte, hat aber keinen Erfolg gebracht :confused_alt:
 
Zurück
Oben