1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Abfrage aus 2 Tabellen

Dieses Thema im Forum "Oracle" wurde erstellt von bequiet, 20 Dezember 2019.

  1. bequiet

    bequiet Neuer Benutzer

    Hallo zusammen,

    ich komme hier leider bei einer Aufgabe nicht weiter...

    Ich habe 2 Tabellen gegeben. In Tabelle A stehen Wörter auf Deutsch und Englisch. Jede Zeile hat 3 Spalten, ID, Wort, Sprache (In Sprache steht 0 für Englisch und 1 für Deutsch). In der 2. Tabelle sind die ID´s aus Tabelle A über Kreuz gespeichert in IDA und IDB um somit zu kennzeichnen das dies die jeweilige Übersetzung ist.
    Also Quasi
    ID 1 Apfel
    ID 2 Apple

    IDA 1 IDB 2
    IDA 2 IDB 1

    Jetzt soll ich eine Liste der Worte ausgeben und als .csv speichern. Spalter 1 Deutsch, Spalte 2 Englisch.
    Ich bekomme das bisher nicht wirklich hin. Kann mir da jemand helfen? Bisher gebe ich nur folgendes aus:

    Select src_term_id, dst_term_id, bbk_term.term from bbk_trans left join bbk_term on bbk_term.id = src_term_id;

    Gruß
     
  2. castorp

    castorp Datenbank-Guru

    Du musst von der Tabelle der deutschen Wörter zu den Übersetzungen joinen und von dort weiter zu den englischen Wörtern

    Sowas in der Art:
    Code:
    select d.word as wort_deutsch, e.word as wort_englisch
    from words d
      join translations tr on d.id = tr.from_word
      join words e on e.id = tr.to_word and e.lang = 0
    where d.lang = 1
    Online Beispiel
     
  3. bequiet

    bequiet Neuer Benutzer

    Das Problem ist, dass die Deutschen und Englischen Wörter in der gleichen Tabelle stehen. Die einzige Unterscheidung ist eben die language id
     
  4. castorp

    castorp Datenbank-Guru

    Das habe ich schon verstanden.

    Durch "where d.lang = 1" werden nur die deutschen Wörter für den Alias "d" selektiert und durch die Bedingung "and e.lang = 0" werden für den Alias "e" nur die englischen Wörter selektiert.
     
  5. bequiet

    bequiet Neuer Benutzer

    Aber deine Abfrage geht doch davon aus das die englischen und deutschen Wörter in anderen Tabellen stehen. Es gibt aber nur die 3 Spalten und die beiden Tabellen. In der einen stehen alle Wörter und die Sprachid, und in der anderen sind nur die ID´s mit der Zuordnung gespeichert. Also IDA -> IDB und IDA <- IDB oder verstehe ich da was grundlegend falsch?
     
  6. castorp

    castorp Datenbank-Guru

    Nein, meine Abfrage geht davon aus, dass die Übersetzung (von -> nach) in einer anderen Tabelle stehen. Die Wörter stehen alle in der gleichen Tabelle (words)
    Hast Du Dir mein Online Beispiel angesehen? Was ist an den Tabellen anders als an Deinen?

    Für solche Fragen ist es immer am Besten wenn man die Tabellen als CREATE TABLE Statement mit in die Frage aufnimmt um Verwirrungen zu vermeiden. Oder gleich ein kleines Online Skript wie ich es in meiner Antwort gemacht habe.

    Du kannst meine Abfrage auch so schreiben:
    Code:
    select d.word as wort_deutsch, e.word as wort_englisch
    from (
      select *
      from words
      where lang = 1
    ) de_words
      join translations tr on de_words.id = tr.from_word
      join (
        select *
        from words
        where lang = 0
      ) en_words on en_words.id = tr.to_word
    
    Vielleicht ist es so klarer.

    Oder explizit mit common table expressions:
    Code:
    with de_words as (
      select *
      from words
      where lang = 1
    ), en_words as (
      select *
      from words
      where lang = 0
    )
    select d.word as wort_deutsch, e.word as wort_englisch
    from de_words
      join translations tr on de_words.id = tr.from_word
      join en_words on en_words.id = tr.to_word
    
     
    Walter gefällt das.
  7. bequiet

    bequiet Neuer Benutzer

    Ja du hast Recht. Habe einen dummen Fehler eingebaut.
    Danke dir für die Hilfe :)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden