Neuigkeiten:

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

Mobiles Hauptmenü

Daten aus einer Spalte aufteilen

Begonnen von Alex_83, Juli 24, 2011, 23:13:29

⏪ vorheriges - nächstes ⏩

Alex_83

Hallo!

Ich weiß nicht ob ich hier richtig bin, aber ich komme an einer Stelle einfach nicht weiter. Vielleicht kann mir hier ja jemand helfen.

Folgendes will ich erreichen:


[Tabelle 1: Bedingung 1]
|
|----------> Id_1 ----> [Tabelle 2: Namen] -----> Id_1_Name
|                   |
|                    -------------------------------------> Id_1
|
-----------> Id_2 ----> [Tabelle 2: Namen] -----> Id_2_Name
                   |
                     -------------------------------------> Id_2

Vorerst soll eine Datentabelle mit 4 Ergebnissen erzeugt werden. Bis auf die zweite Id_2_Name funktioniert das bisher tadellos. Doch wenn er den zweiten Abrufen will, wird abgebrochen, weil Id_2_Name aus der gleichen Spalte wie Id_1_Name gezogen werden soll.
Soweit habe ich mein Problem gefunden, aber ich finde keinen Workaround dafür. Noch habe ich eine Idee :-/

Mein der zeitiger Code

SELECT Tabelle1.parentTypeID AS ID_1, Tabelle2.typeName AS Name_1, Tabelle2.typeID AS ID_2, Tabelle1.typeName AS Name_2
FROM Tabelle1, Tabelle2
WHERE Tabelle1.metaGroupID= 2 AND Tabelle2.typeID = Tabelle1.typeID AND Tabelle2.typeID = Tabelle1.parentTypeID

Das Problem ist einmal dass ich mit der zusätzlichen Bedingung
AND Tabelle2.typeID = Tabelle1.typeID             eigentlich schonmal die Bedingung gegeseitig ausschließe. Aber wenn ich diese nicht einsetze dann kann ich auch nicht den Namen der zweiten Id auslesen.

Was kann man nun tun?
Über Hilfe würde ich mich sehr freuen. Falls die Frage zu trivial ist wäre ein Verweis auf ein Tutorial / gutes Fachbuch auch nett, bzw. auch ein passender Suchstring für google, da ich nicht mal weiß wie ich das Problem kurz benennen könnte.

Alex

MzKlMu

Hallo,
ich komme mit deiner Beschreibung nicht klar. Kannst Du das mal etwas besser beschreiben?
Was willst Du wo schreiben?

Beschreibe Dein Vorhaben einfach mal verbal.
Gruß Klaus

Alex_83

Danke für die schnelle Antwort.

Natürlich, ich probiere es nochmal:
Ich habe in meiner vorhandenen Datenbank ein Table mit folgenden Informationen:
typeID    parentTypeID    metaGroupID
380            377                    2
394            393                     2
400            399                    2
..               ...                    ..
Aus dieser möchte ich genauere Informationen zu den typeID und parentTypeID holen wenn  Tabelle1.metaGroupID= 2   ,
nämlich aus Tabelle2. Zunächst soll erstmal für typeID und parentTypeID der typeName jeweils herausgesucht werden.

Aufbau Tabelle2:
typeID    groupID    typeName                          description    graphicID      ...
400            40            Gegenstand XYZ             Beschreibung       ...
399          40            Gegenstand aaa                 bla bla                 ...

D.h. die fertige Anfrage soll dann am Ende jeweils den Namen dazu haben und ungefähr so ausehen

typeID    typeID_Name                 parentTypeID     parentTypeID_Name
400          Gegenstandt XYZ            399                    Gegenstand aaa

Das Problem liegt, soweit ich das erkenne, daran dass ich typeName aus Tabelle2  zweimal brauche. Und ich weiß nicht mit welcher Methode ich rankomme, ich habe mich durch einige Tutorials gelesen und durchprobiert, aber kein Erfolg.

Das ganze funktioniert bis ich den 2ten typeName holen will, dass ist also der letzte funktionierende Aufruf:
SELECT Tabelle1.parentTypeID AS ID_1, Tabelle2.typeName AS Name_1, Tabelle1.typeID AS ID_2, Tabelle2.typeName AS Name_2
FROM Tabelle1, Tabelle2
WHERE Tabelle1.metaGroupID= 2 AND Tabelle2.typeID = Tabelle1.typeID AND Tabelle2.typeID = Tabelle1.parentTypeID

Und dort hänge ich nun fast nun shcon den ganzen Tag drann..

DF6GL

Hallo,


geh in den Abfrageentwurf, füge Tabelle1 einmal und Tabelle2 zweimal hinzu. Verknüpfe zunächst Tabelle1 mit Tabelle2 über Tabelle1.typeID und Tabelle2.typeID,
sodann Tabelle1 mit Tabelle2_1 (das ist die virtuelle Tabelle2) über Tabelle1.parentTypeID und Tabelle2_1.typeID

Ziehe die Sternchen aus den Tabellen in jeweils eine Spalte (oder lediglich die benötigten Felder) . Das Kriterium-Feld  für Spalte metaGroupID  erhält den Wert 2

Alex_83

Hallo!

Erstmal Danke DF6GL, du hast mich auf die richtige Idee gebracht. Auch wenn ich keinen Abfrageentwurf habe, da ich mit C# in einer Access Datenbank werke, so konnte ich die Idee übernehmen.

Die Anpassung und den richtigen Query hat zwar lange gedauert, aber schließlich geht es.
Hier (die erste funktionierende) Version:

SELECT ErsteTabelle.ID_T1, ErsteTabelle.Name_T1, ErsteTabelle.ID_T2, ZweiteTabelle.Name_T2 " +
     "FROM (SELECT invMetaTypes.parentTypeID AS ID_T1, invTypes.typeName AS Name_T1, invMetaTypes.typeID AS ID_T2 FROM invMetaTypes, invTypes WHERE invMetaTypes.metaGroupID= 2 AND invTypes.typeID = invMetaTypes.parentTypeID) ErsteTabelle, "+
     
    "(SELECT invTypes.typeName AS Name_T2, invMetaTypes.typeID AS ID_T2_Temp FROM invMetaTypes, invTypes WHERE invMetaTypes.metaGroupID= 2 AND invTypes.typeID = invMetaTypes.typeID) ZweiteTabelle " +

"WHERE ZweiteTabelle.ID_T2_Temp = ErsteTabelle.ID_T2", conn);

DF6GL

Hallo,

naja, dann empfehle ich Dir , für solche Zwecke (Erstellen von komplexeren Abfragen) doch den Abfrageentwurf von Access zu verwenden.

Deine SQL mag ja gehen, ist aber nicht sehr performant, weil die Tabellenbeziehungen nicht über "Joins" abgebildet werden.


Desweiteren rate ich DRINGEND dazu, keine reservierten Wörter ("Name") zu benutzen, mindestens aber solche Namen in Eckklammern zu setzen.

Alex_83

Hallo,

vielen Dank für den Tipp, ich habe mir mal Access 2010 Trial runtergeladen und muss sagen dass mir das wirklich gefällt. Hätte mir das SQL-Buch dann auch sparen können zu kaufen -.-. Wobei der Lerneffekt da recht gering ist und das Projekt dient wieder was zu lernen.

Und auf die reservierten Wörter werde ich achten, wobei die Original-DB auf der ich zugreife, fast nur daraus besteht..

Beste Grüße,
Alex