Probleme mit Unterabfrage

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 15:24:58 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net
Deutsche PostgreSQL User Group: http://pgug.de

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?