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

exzel

SQL-Guru
Beiträge
170
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!
 
Werbung:
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ß
 
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.
 
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!
 
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']}'
 
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ß
 
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.
 
Werbung:
Zurück
Oben