Glengamoi · AspHeute (Artikel) · .NET Heute (RSS-Suche) · .NET Blogs · Glengamoi Suche (Installieren via Klick)

Glengamoi

Die Diskussionsforen der deutschen .NET Community
Willkommen bei Glengamoi. Anmeldung | Registrieren | Hilfe
in Suchen

Join ohne doppelte Einträge

Letzter Beitrag 01-19-2009 17:25 von Daniel_Leuthold. 6 Antworten.
Seite 1 von 1 (7 Treffer)
Beiträge sortieren: Zurück Weiter
  • 01-19-2009 14:30

    Join ohne doppelte Einträge

    Hallo zusammen,

    bin einigermassen unerfahren was SQL-Abfragen betrifft und hoffe, dass mir hier vielleicht jemand helfen kann.

    Arbeite mit klassischem ASP, VBScript und einer Access-Datenbank.

    Habe eine Tabelle mit Gebäuden (Tabelle heist PR_TEST, die Felder ID_PR, Titel, Ort etc.) und eine zweite Tabelle mit Fotos (ID, ID_PR - verweis auf die andere Tabelle, Titelbild ja/nein, Dateiname - nur der Dateiname ist in der Datenbank abgelegt) die zu den Gebäuden gehören. Zu den Gebäuden können jeweils keine bis unendlich viele Fotos gehören.

     Nun möchte ich als Resultat alle Objekte (egal ob ohne oder mit vielen Fotos) inkl. dem Titelbild (resp. Dateinamen des Titelbildes) erhalten.

     Was ich erreicht hab:

    - mit "SELECT PR_TEST.ID_PR, PR_Fotos.ID_PR, PR_TEST.Titel, PR_Fotos.Dateiname FROM PR_TEST INNER JOIN PR_Fotos ON PR_TEST.ID_PR = PR_Fotos.ID_PR" erhalte ich alle Objekte, leider aber auch viele Objekte mehrfach, da für diese Objekte eben auch mehrere Fotos vorhanden sind. Sobald ich am Schluss ein "GROUP BY PR_TEST.ID_PR " einfüge, erhalte ich folgende Fehlermeldung: [Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'ID_PR' as part of an aggregate function.

    - habe auch versucht, mit Alias zu arbeiten: "SELECT A.PR_ID From PR_TEST As A INNER JOIN (Select B.ID_PR From PR_Fotos as B WHERE Titelbild = -1 ) On A.PR_ID = B.PR_ID". Das bringt mir leider folgende Fehlermeldung: [Microsoft][ODBC Microsoft Access Driver] Syntax error in JOIN operation.

    Hat mir jemand einen Tip? Veilen Dank!

     

    • IP-Adresse ist Registriert
  • 01-19-2009 14:50 Antwort zu

    AW: Join ohne doppelte Einträge

    Probier mal:

    SELECT DISTINCT PR_TEST.ID_PR, PR_Fotos.ID_PR, PR_TEST.Titel, PR_Fotos.Dateiname FROM PR_TEST INNER JOIN PR_Fotos ON PR_TEST.ID_PR = PR_Fotos.ID_PR

    • IP-Adresse ist Registriert
  • 01-19-2009 14:59 Antwort zu

    AW: Join ohne doppelte Einträge

    Hallo Chris,

    besten Dank für die Idee... das hatte ich bereits ausprobiert. Bei dieser Abfrage resultieren die Objekte wie gewünscht nicht in mehrfacher Anzahl, jedoch fehlen dann leider sämtliche Objekte, bei denen keine Fotos zugeordnet sind...

    Genau das ist mir wichtig. Ich benötige eine Liste mit allen Objekten und bei den Objekten mit Fotos brauch ich jeweils den Dateinamen dazu.

    • IP-Adresse ist Registriert
  • 01-19-2009 15:44 Antwort zu

    AW: Join ohne doppelte Einträge

    Dann

    SELECT DISTINCT PR_TEST.ID_PR, PR_Fotos.ID_PR, PR_TEST.Titel, PR_Fotos.Dateiname FROM PR_TEST Right JOIN PR_Fotos ON PR_TEST.ID_PR = PR_Fotos.ID_PR

     oder

    SELECT DISTINCT PR_TEST.ID_PR, PR_Fotos.ID_PR, PR_TEST.Titel, PR_Fotos.Dateiname FROM PR_TEST Left JOIN PR_Fotos ON PR_TEST.ID_PR = PR_Fotos.ID_PR

     ich vergess es immer wieder ;-) ...

    MAch Dir doch Deine Abfragen im access Abfragendesigner...

    • IP-Adresse ist Registriert
  • 01-19-2009 16:12 Antwort zu

    AW: Join ohne doppelte Einträge

    Leider liefert diese Abfrage auch nicht das gewünschte Ergebnis. Die Objekte (Gebäude) bleiben mehrfach in der Liste vorhanden.

    Bez. Distinct müsste ich wohl die Abfrage wie folgt abändern: "SELECT DISTINCT PR_TEST.ID_PR FROM PR_TEST Left JOIN PR_Fotos ON PR_TEST.ID_PR = PR_Fotos.ID_PR" - dann erhalte ich grundsätzlich die richtigen Datensätze. Das Problem dabei ist, dass ich keine weiteren Infos wie Namen, Orte oder Dateinamen zum Objekt erhalte. Wenn ich die gewünschten Felder nach Distinct einfüge, stimmen aber die Objekte nicht mehr, resp. die Objekte werden dann in mehrfacher Anzahl (gem. Anzahl Fotos in der zweiten Tabelle) angezeigt. Ich steh da irgendwo auf dem Schlauch...

    Meinst Du die SQL-Ansicht in Access (Abfrage>SQL-Ansicht?). Leider krieg ich auch in Access nicht das gewünschte Resultat hin. Entweder hab ich die korrekte Aufzählung der Objekte ohne Fotos oder ich habe alle Objekte mit Fotos aber mit mehrfachnennung der Objekte.

     Noch weitere Ideen oder andere Lösungsansätze? Oder suche ich am falschen Ort?

    • IP-Adresse ist Registriert
  • 01-19-2009 16:22 Antwort zu

    AW: Join ohne doppelte Einträge

    Quick and maybe dirty:

    SELECT ID_PR, Titel, (SELECT TOP 1 Dateiname FROM PR_Fotos WHERE PR_Fotos.ID_PR = PR_TEST.ID_PR) AS [Dateiname] FROM PR_TEST

    Ausserdem müsste es eigentlich kein LEFT sondern nen LEFT OUTER join sein, weil du ja alle von left haben willst, auch wenn right nichts existriert, das geht aber nicht, da du nicht nur 1 spalte von den Fotos holst sondern 2 obwohl du die ID_PR im PR_Fotos gar nicht brauchst (sprich doppelt). So oder so würde dir aber ein Distinct über den Fotodateiname immer mehrere Ergebnisse mit der gleichen ID_PR zurück geben, wenn müsstest du ihn mit MIN, MAX oder einer anderen Aggregatfunktion auf einen Eintrag runter bringen, damit das geht:

    SELECT DISTINCT PR_TEST.ID_PR, PR_TEST.Titel, MIN(PR_Fotos.Dateiname) AS [Dateiname] FROM PR_TEST LEFT OUTER JOIN PR_TEST.ID_PR = PR_Fotos.ID_PR

    • IP-Adresse ist Registriert
  • 01-19-2009 17:25 Antwort zu

    AW: Join ohne doppelte Einträge

    Vielen herzlichen Dank, das war der entscheidende Tip!

    Etwas abgeändert funktioniert es nun wie gewünscht und sieht nun folgendermassen aus:

    "SELECT ID, Titel, Anzeigen, Verzeichnis, Ort, Jahr, (SELECT Dateiname FROM PR_Fotos WHERE PR_Fotos.Titelbild = -1 AND PR_Fotos.ID_PR = PR.ID) AS [Dateiname] FROM PR WHERE Anzeigen = -1 AND Verzeichnis = -1 ORDER BY Jahr DESC"

     Nochmals vielen Dank, Gruss aus Zürich.

    • IP-Adresse ist Registriert
Seite 1 von 1 (7 Treffer)