Probleme mit SQL Joins, bei mehreren Joins auf einer Tabelle



  • Hi,

    ich weiß nicht wie man einen bestimmten SQL baut, bzw. ob dies überhaupt möglich ist.

    Sagen wir ich habe folgende Tabellen:

    products
    - products_id
    - products_oem
    - products_price
    - products_name_id_1
    - products_name_id_2
    - products_name_id_3

    products_name_id_to_language_id
    - products_name_id_x
    - products_name_id
    - language_id

    products_names
    - products_name_id
    - products_name

    Es gibt quasi eine Tabelle mit Produkten. Jedes Produkt kann mehrere Namen haben und in der products Tabelle sind hierfür nur die ID's der Namen hinterlegt.

    Jede ID zeigt dann auf einen Eintrag in der products_name_id_to_language_id
    , denn jeder Name heißt in einer anderen Sprache anders. Hier wird dann auf die ID zum Produktnamen verwiesen, wo der Produktname steht.

    select * from products p, products_name_id_to_language_id pl, products_names pn WHERE p.products_name_id_1 = pl.products_name_id_x AND pl.language_id = 2 and pl.products_name_id = pn.products_name_id

    Ich dies hauto soweit hin. Ich erhalte nun alle Alle Produkte mit den 1. Produktnamen in der korrekten Sprache.

    Nun Frage ich mich ob man den SQL auch so gestalten kann, dass auch die anderen Produktnamen in der passenden Sprache mit ausgelesen werden. Wenn dieser in einer anderen Sprache nicht existiert soll er null zurückgeben. Wäre gut, wenn die Produktnamen einen eigenen spalten Namen im Abfrageergebnis erhalten.

    Ja, hier komme ich nicht weiter, weil ich nicht weiß ob es geht und wie das aussehen könnte. Kennt sich da jemand aus?

    Grunzy



  • Du willst also alle drei Produktnamen nebeneinander anzeigen? Da benötigst du dann auch entsprechend viele Joins ala

    SELECT *
    FROM products p,
         products_name_id_to_language_id pl1, product_names n1,
         products_name_id_to_language_id pl2, product_names n2,
         products_name_id_to_language_id pl3, product_names n3
    WHERE
         p.product_name_id_1 = pl1.product_name_id_x AND pl1.product_name_id = n1.product_name_id
     AND p.product_name_id_2 = pl2.product_name_id_x AND pl2.product_name_id = n2.product_name_id
    ...
    

    (eventuell benötigst du auch Outer Joins, um die NULL-Werte umzusetzen)

    PS: Irgendwie habe ich das Gefühl, daß deine Datenbankstruktur ein wenig zu kompliziert ist (ganz davon abgesehen, daß die product_name_id_x schon ein Verstoß gegen die 1. Normalform sind).



  • CStoll schrieb:

    Du willst also alle drei Produktnamen nebeneinander anzeigen? Da benötigst du dann auch entsprechend viele Joins ala

    SELECT *
    FROM products p,
         products_name_id_to_language_id pl1, product_names n1,
         products_name_id_to_language_id pl2, product_names n2,
         products_name_id_to_language_id pl3, product_names n3
    WHERE
         p.product_name_id_1 = pl1.product_name_id_x AND pl1.product_name_id = n1.product_name_id
     AND p.product_name_id_2 = pl2.product_name_id_x AND pl2.product_name_id = n2.product_name_id
    ...
    

    (eventuell benötigst du auch Outer Joins, um die NULL-Werte umzusetzen)

    PS: Irgendwie habe ich das Gefühl, daß deine Datenbankstruktur ein wenig zu kompliziert ist (ganz davon abgesehen, daß die product_name_id_x schon ein Verstoß gegen die 1. Normalform sind).

    Jup, wobei ich die "richtige" JOIN-Schreibweise schöner finde (z. B.):

    SELECT a.name, a.nachname, b.straße, b.plz, b.ort
    FROM person a
    JOIN anschriften b ON a.nranschrift = b.nranschrift
    

    Finde ich einfach übersichtlicher...



  • Huhu,

    das Datenbankformat ist auch recht komplex. Ich hatte das Problem in ein Beispiel umgewandelt. Die Datenbank stammt nicht von mir, sondern die nutzt eine ganze Industrie und da sind > 50GB Daten drinnen.

    Aber danke für die Hilfe damit sollte ich weiter kommen, wegen den null werde ich es dann noch left bzw. right join mal versuchen.

    Grunzy


Anmelden zum Antworten