Probleme mit Unterabfrage
am 04.09.2006 14:40:14 von Karsten Jacob
Hi NG.
Ich sehe den Wald mal wieder vor lauter Bäumen nicht, bitte helft mir.
Folgendes Problem:
1. Abfrage:
"SELECT kartennr_shell AS kartennummer FROM lkw WHERE zugnummer = 124"
--> 2 Ergebnisse: 014, 665
2. Abfrage:
"SELECT * FROM tankdaten WHERE ag = (Ergebnisse aus der 1. Abfrage)"
--> Ergebniss sollen alle Daten mit der Zugnummer 014 und 665 sein.
Wie kriege ich das in einer Abfrage untergebracht?
Danke & Tüs,
Karsten
Re: Probleme mit Unterabfrage
am 04.09.2006 16:13:39 von Karsten Jacob
Andreas Kretschmer schrieb:
> begin Karsten Jacob schrieb:
>> Hi NG.
>>
>> Ich sehe den Wald mal wieder vor lauter Bäumen nicht, bitte helft mir.
>
> Wie wäre es mit der Lektüre eines Buches zu SQL? Oder erwartest Du die
> Lösung eingeritzt in der Rinde unschuldiger Bäume?
>
>
>> "SELECT * FROM tankdaten WHERE ag = (Ergebnisse aus der 1. Abfrage)"
>
> Als Hint: WHERE ag in (select ...)
>
>
>> Wie kriege ich das in einer Abfrage untergebracht?
>
> Das Problem könnte hier aber auch das von Dir gewählte RDBMS sein, falls
> es zu alt ist: zu alte Versionen können IIRC keine Subselects. Wie man
> das notfalls löst, ist IIRC eine FAQ.
>
Tut mir leid, es lag an einer alten mySQL Version. Subselect erst ab
mySQL 4.1.
Sorry, habe ich übersehen.
Trotzdem Danke,
Karsten
Re: Probleme mit Unterabfrage
am 04.09.2006 16:48:41 von Thomas Rachel
Karsten Jacob wrote:
> Tut mir leid, es lag an einer alten mySQL Version. Subselect erst ab
> mySQL 4.1.
Subselects sind bei einer so einfachen Verknüpfung überhaupt nicht nötig.
Ein einfacher JOIN tut es auch.
SELECT tankdaten.*
FROM tankdaten
JOIN lkw ON tankdaten.ag=lkw.kartennr_shell
WHERE lkw.zugnummer = 124
(Daà tankdaten.* böse ist, ergibt sich aus irgendeiner FAQ. Ich habe es nur
so übernommen, weil es in Deinem Originalbeispiel auch so drin war.)
Desweiteren kommt es mir so vor, als wäre Dein Datenmodell nicht richtig
normalisiert: was machst Du, wenn neben den in lkw bisher vorgesehenen noch
weitere Tankdaten hinzukommen? Shell, Aral, BP, Esso, ... (ja, ich weiÃ,
einige davon wurden zusammengefaÃt. Aber dennoch ist es IMHO nicht ganz
abwegig.)
Geschickter wäre eine Tabelle Karten mit den Spalten lkw_id (oder
zugnummer), kartennr und kartenfirma - letzteres kann entweder direkt ein
String sein oder noch besser eine ID, verknüpft mit einer weiteren Tabelle
kartenfirmen o.ä.
Vielleicht willst Du oben auch noch zusätzlich einschränken, daà nur die aus
Tankdaten genommen werden, die ebenfalls von Shell sind - ich weià nicht
wie gut (oder: ob überhaupt) die Nummernbereiche der diversen Karten
kollisionsfrei ausgelegt sind. (Wofür steht eigentlich ag?)
Thomas
--
Wenn nichts an Teflon haftet, wieso haftet dann Teflon an der Pfanne?