1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Abfrage über viele Tabellen -> Column '' in field list is ambiguous

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von exzel, 20 März 2012.

  1. exzel

    exzel Datenbank-Guru

    Hallo zusammen,

    ich möchte folgende Abfrage durchführen.

    $mysqli->query("SELECT beitrag, DATE_FORMAT(ablauf,'%m') as monat, zw FROM bausparer, haftpflicht, hausrat,
    kapitalanlagen, kfz, multiplus, pflegeversicherungpri, rechtsschutz, vertraege_kv, vertraege_lv, vertraege_u, wohngebaude WHERE id_vn='{$_SESSION['kundenauswahl']}'");

    Doch leider erhalte ich immer die Fehlermeldung: "Column 'beitrag' in field list is ambiguous."

    Nun, die Spalte beitrag, ablauf, zw kommen in allen Tabllen vor. Ich dachte damit wird die Abfrage leichter. Wie muss ich die Abfrage gestalten, damit sie funktioniert. Ist es auch möglich die Abfrage ohne Join hinzubekommen (bin nämlich noch Anfänger und möchte zuerst die normale Abfrage beherrschen)?

    Gruß und Dank!
     
  2. exzel

    exzel Datenbank-Guru

    Hallo nochmal,

    ich hab' das zwar soweit hingbekommen, dass die Abfrage gemacht wird, aber leider habe ich jetzt ein anderes Problem.

    Hier erst mal die Abfrage.

    SELECT
    bausparer.beitrag,
    haftpflicht.beitrag,
    hausrat.beitrag,
    kapitalanlagen.beitrag,
    kfz.beitrag,
    multiplus.beitrag,
    pflegeversicherungpri.beitrag,
    rechtsschutz.beitrag,
    vertraege_kv.beitrag,
    vertraege_lv.beitrag,
    vertraege_u.beitrag,
    wohngebaude.beitrag,
    DATE_FORMAT(bausparer.ablauf,'%m'),
    DATE_FORMAT(haftpflicht.ablauf,'%m'),
    DATE_FORMAT(hausrat.ablauf,'%m'),
    DATE_FORMAT(kapitalanlagen.ablauf,'%m'),
    DATE_FORMAT(kfz.ablauf,'%m'),
    DATE_FORMAT(multiplus.ablauf,'%m'),
    DATE_FORMAT(pflegeversicherungpri.ablauf,'%m'),
    DATE_FORMAT(rechtsschutz.ablauf,'%m'),
    DATE_FORMAT(vertraege_kv.ablauf,'%m'),
    DATE_FORMAT(vertraege_lv.ablauf,'%m'),
    DATE_FORMAT(vertraege_u.ablauf,'%m'),
    DATE_FORMAT(wohngebaude.ablauf,'%m'),
    bausparer.zw,
    haftpflicht.zw,
    hausrat.zw,
    kapitalanlagen.zw,
    kfz.zw,
    multiplus.zw,
    pflegeversicherungpri.zw,
    rechtsschutz.zw,
    vertraege_kv.zw,
    vertraege_lv.zw,
    vertraege_u.zw
    FROM
    bausparer,
    haftpflicht,
    hausrat,
    kapitalanlagen,
    kfz,
    multiplus,
    pflegeversicherungpri,
    rechtsschutz,
    vertraege_kv,
    vertraege_lv,
    vertraege_u,
    wohngebaude
    WHERE
    bausparer.id_vn='{$_SESSION['kundenauswahl']}' OR haftpflicht.id_vn='{$_SESSION['kundenauswahl']}' OR
    hausrat.id_vn='{$_SESSION['kundenauswahl']}' OR kapitalanlagen.id_vn= '{$_SESSION['kundenauswahl']}' OR
    kfz.id_vn='{$_SESSION['kundenauswahl']}' OR multiplus.id_vn='{$_SESSION['kundenauswahl']}' OR
    pflegeversicherungpri.id_vn='{$_SESSION['kundenauswahl']}' OR rechtsschutz.id_vn='{$_SESSION['kundenauswahl']}' OR
    vertraege_kv.id_vn='{$_SESSION['kundenauswahl']}' OR vertraege_lv.id_vn='{$_SESSION['kundenauswahl']}' OR
    vertraege_u.id_vn='{$_SESSION['kundenauswahl']}'


    Das Problem ist nur, dass die Abfrage ein leeres Ergebnis zurückliefert, sobald eine der Spalte leer ist. Wie kann ich diese Abfrage so formulieren, dass sie auch dann Ergebnisse zurückliefert, wenn einige Spalten leer sind.

    Gruß
     
  3. ukulele

    ukulele Datenbank-Guru

    Also erstmal bist du schon mitten im Thema Join, denn ein SELECT über mehrere Tabellen ist prinzipiell auch ein Join, nur eben nicht mit JOIN als Befehl. Und hier liegt eventuell auch deine Lösung, wenn das überhaupt das ist, was du willst.

    Du solltest auf jedenfall erstmal mit 2 Tabellen anfangen. So, wie das jetzt formuliert ist, müsste es eine riesige Datenmenge ausgeben, da die Bedingungen alle nur alternativ gelten (OR und nicht AND). Sobald deine "Kundenauswahl" in jeder Tabelle nur 10 Treffer liefert erhälst du 10^12 = 1.000.000.000.000 Datensätze. Eigentlich ist die ganze Abfrage komplett Müll. Die Daten müssen in einem sinnvollen Zusammenhang zueinander gesetzt werden, in der Regel passiert das über Fremdschlüssel.

    Wenn du einfach nur in jeder Tabelle nach einer Vertragsnummer suchen willst, und die Ergebnisse auflisten möchtest, solltest du das mit einzelnen Abfragen machen.
     
  4. exzel

    exzel Datenbank-Guru

    Hallo und danke für die Antwort,

    die Lösung liegt nicht im Join, sondern im Union. Ich wollte eine große Tabelle, aus der ich dann die Daten ziehe.

    $vertraege=$mysqli->query("
    SELECT gesellschaft, beitrag, DATE_FORMAT(ablauf,'%m') as ablauf, zw FROM bausparer WHERE id_vn = '{$_SESSION['kundenauswahl']}' UNION
    SELECT gesellschaft, beitrag, DATE_FORMAT(ablauf,'%m') as ablauf, zw FROM haftpflicht WHERE id_vn = '{$_SESSION['kundenauswahl']}' UNION
    SELECT gesellschaft, beitrag, DATE_FORMAT(ablauf,'%m') as ablauf, zw FROM hausrat WHERE id_vn = '{$_SESSION['kundenauswahl']}' UNION
    SELECT gesellschaft, beitrag, DATE_FORMAT(ablauf,'%m') as ablauf, zw FROM kapitalanlagen WHERE id_vn = '{$_SESSION['kundenauswahl']}' UNION
    SELECT gesellschaft, beitrag, DATE_FORMAT(ablauf,'%m') as ablauf, zw FROM kfz WHERE id_vn = '{$_SESSION['kundenauswahl']}' UNION
    SELECT gesellschaft, beitrag, DATE_FORMAT(ablauf,'%m') as ablauf, zw FROM multiplus WHERE id_vn = '{$_SESSION['kundenauswahl']}' UNION
    SELECT gesellschaft, beitrag, DATE_FORMAT(ablauf,'%m') as ablauf, zw FROM pflegeversicherungpri WHERE id_vn = '{$_SESSION['kundenauswahl']}' UNION
    SELECT gesellschaft, beitrag, DATE_FORMAT(ablauf,'%m') as ablauf, zw FROM rechtsschutz WHERE id_vn = '{$_SESSION['kundenauswahl']}' UNION
    SELECT gesellschaft, beitrag, DATE_FORMAT(ablauf,'%m') as ablauf, zw FROM vertraege_kv WHERE id_vn = '{$_SESSION['kundenauswahl']}' UNION
    SELECT gesellschaft, beitrag, DATE_FORMAT(ablauf,'%m') as ablauf, zw FROM vertraege_lv WHERE id_vn = '{$_SESSION['kundenauswahl']}' UNION
    SELECT gesellschaft, beitrag, DATE_FORMAT(ablauf,'%m') as ablauf, zw FROM vertraege_u WHERE id_vn = '{$_SESSION['kundenauswahl']}' UNION
    SELECT gesellschaft, beitrag, DATE_FORMAT(ablauf,'%m') as ablauf, zw FROM wohngebaude WHERE id_vn = '{$_SESSION['kundenauswahl']}'
    ");

    Vielen Dank!
     
  5. ukulele

    ukulele Datenbank-Guru

    Ja, das nutze ich auch öfter, geht allerdings nur wenn die Spalten gleich sind.

    Vieleicht wird es noch schneller, wenn du aus dem SELECT eine Sicht in der Datenbank baust die die KundenID als Fremdschlüssel mit anzeigt. Dann hättest du nur ein SELECT * FROM sicht WHERE id_vn = '{$_SESSION['kundenauswahl']}'
     
  6. exzel

    exzel Datenbank-Guru

    Hallo und danke für die Antwort,

    leider habe ich noch nie einen View gemacht also belasse ich es vorerst bei Union.

    Trotzdem dem Danke!

    Gruß
     
  7. ukulele

    ukulele Datenbank-Guru

    Du würdest einfach im SQL Studio eine neue View anlegen und deinen SELECT da rein kopieren und speichern :)

    Edit: Arg sry, MSSQL != MySQL... k.a. wie das bei MySQL geht.
     
  8. exzel

    exzel Datenbank-Guru

    Passt schon! Vielen Dank!
     
Die Seite wird geladen...

Diese Seite empfehlen