Problem mit einer SQL Abfrage
Problem mit einer SQL Abfrage
am 18.09.2006 18:17:53 von Michael Plate
Hallo Leute!
ich hab ein Problem mit einer Abfrage und komme nicht auf die entscheidene
Lösung.
Ich mache gerade ein Beispiel mit einer Verleihliste. In der Tabelle A
werden alle Positionen aufgelistet, die man verleihen kann. In der zweiten
Tabelle werden alle Positionen aufgelistet, die gerade unterwegs sind. Ich
möchte eine Abfrage bilden, die mir alle Positionen anzeigt, die noch zur
Verfügung stehen.
Tabelle A
id | title | active|...
01| A| true | ...
02| B| true | ...
03 |C | false | ...
Tabelle B
id | rental | restituion
01|12.08.| ...
Angezeigt werden soll nur der Datensatz mit id=2 aus Tabelle A. Irgendwie
sieht das einfach aus, aber ich hänge jetzt schon mehreren Stunden dran und
komme nicht auf die Lösung.
Hat jemand einen Tipp für mich. Vielen Dank im Voraus.
Gruss
Michael
Re: Problem mit einer SQL Abfrage
am 18.09.2006 18:51:49 von Thomas Rachel
Michael Plate wrote:
> Hallo Leute!
>
> ich hab ein Problem mit einer Abfrage und komme nicht auf die entscheidene
> Lösung.
Deine Umlaute sind falsch deklariert und sehen daher bei mir so aus wie hier
gezeigt. Bitte stelle Deinen Outlook Express entsprechend ein.
> Tabelle A
> id | title | active|...
> 01| A| true | ...
> 02| B| true | ...
> 03 |C | false | ...
>
> Tabelle B
> id | rental | restituion
> 01|12.08.| ...
>
> Angezeigt werden soll nur der Datensatz mit id=2 aus Tabelle A.
Und warum? Weil er a) aktiv ist und b) nicht ausgeliehen.
Du willst also Tabelle A und B miteinander verknüpfen (JOIN), daà auf jeden
Fall alle Elemente von A in Erwägung gezogen werden, auch wenn sie keine
Entsprechung in B haben (A LEFT JOIN B). Diese Verknüpfung soll anhand des
gemeinsamen Feldes id geschehen (USING (id) oder ON A.id=B.id).
Angezeigt werden sollen die kombinierten Datensätze, die aktiv sind
(active=true)[1], jedoch nicht die, die ausgeliehen wurde (für die also
restitution NULL ist). Allerdings sollen die Datensätze, für die kein
Eintrag in B existiert und für die also zwar restitution zwar auch NULL
ist, aber auch alle anderen Felder, dabei nicht berücksichtigt werden.)
Hm, das wird jetzt komplizierter.
Beim Verknüpfen sollten die Datensätze, die "zurückgegeben" anzeigen, auÃen
vor gelassen werden: ON A.id=B.id AND B.restitution IS NULL
Also:
SELECT title FROM A LEFT JOIN B ON A.id=B.id AND B.restitution IS NULL AND
B.rental IS NOT NULL WHERE
active='true' /* hier wäre besser: WHERE active != 0 oder so was, je nach
Datentyp */
AND B.rental IS NULL
(ungetestet!)
Welchen Datentyp hat active?
Thomas
--
»Herr Schaffner, ist das mein Zug?«
»Nein, der gehört der DB Reise&Touristik GmbH«
Re: Problem mit einer SQL Abfrage
am 18.09.2006 19:09:41 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Problem mit einer SQL Abfrage
am 18.09.2006 21:00:07 von Michael Plate
Hallo Andreas!
MySQL-Datenbank und der Query Browser kann mit EXCEPT nichts anfangen oder
bin ich auf den falschen Weg. Mittlerweile hab ich das anders gelöst.
Vielleicht umständlich, aber es klappt.
Vielen Dank und einen netten Gruss
Michael
"Andreas Kretschmer" schrieb im Newsbeitrag
news:lf03u3-n3b.ln1@news.a-kretschmer.de...
> begin Michael Plate wrote:
>
>> Ich mache gerade ein Beispiel mit einer Verleihliste. In der Tabelle A
>> werden alle Positionen aufgelistet, die man verleihen kann. In der
>> zweiten
>> Tabelle werden alle Positionen aufgelistet, die gerade unterwegs sind.
>> Ich
>> möchte eine Abfrage bilden, die mir alle Positionen anzeigt, die noch zur
>> Verfügung stehen.
>
>> Tabelle A
>> id | title | active|...
>> 01| A| true | ...
>> 02| B| true | ...
>> 03 |C | false | ...
>
>> Tabelle B
>> id | rental | restituion
>> 01|12.08.| ...
>
>> Angezeigt werden soll nur der Datensatz mit id=2 aus Tabelle A. Irgendwie
>> sieht das einfach aus, aber ich hänge jetzt schon mehreren Stunden dran
>> und
>> komme nicht auf die Lösung.
>
>
> Du suchst EXCEPT. Erst aus A alle selektieren, die active= TRUE sind und
> davon except das Zeugs aus B.
>
> http://www.postgresql.org/files/documentation/books/pghandbu ch/html/sql-select.html
>
>
>
>
> end
> Andreas
> --
> q: why do so many people take an instant dislike to mysql?
> a: it saves time (oicu in #postgresql)
> Explaining the concept of referential integrity to a mysql user is like
> explaining condoms to a catholic (Shadda in #postgresql)
Re: Problem mit einer SQL Abfrage
am 18.09.2006 21:17:25 von Michael Plate
Hallo Thomas!
ich hab es ein bisschen umständlicher gelöst.
Hier ist die entstandene Anweisung
SELECT a.title
FROM ( SELECT * FROM A WHERE active is null ) c
LEFT JOIN ( SELECT * FROM B where restituion is null ) d
ON a.id=b.id
WHERE d.restituion is null
Die Felder active, rental und restituion sind vom Typ Datum (date) und
speichert Datum der Deaktivierung (active), Ausleihdatum und Rückgabedatum.
Ist eher eine Protokollierung.
Gruss
Michael
"Thomas Rachel" schrieb im
Newsbeitrag news:eemir5$c2n$1@glglgl.ath.cx...
> Michael Plate wrote:
>
>> Hallo Leute!
>>
>> ich hab ein Problem mit einer Abfrage und komme nicht auf die
>> entscheidene
>> Lsung.
>
> Deine Umlaute sind falsch deklariert und sehen daher bei mir so aus wie
> hier
> gezeigt. Bitte stelle Deinen Outlook Express entsprechend ein.
>
>
>> Tabelle A
>> id | title | active|...
>> 01| A| true | ...
>> 02| B| true | ...
>> 03 |C | false | ...
>>
>> Tabelle B
>> id | rental | restituion
>> 01|12.08.| ...
>>
>> Angezeigt werden soll nur der Datensatz mit id=2 aus Tabelle A.
>
> Und warum? Weil er a) aktiv ist und b) nicht ausgeliehen.
>
> Du willst also Tabelle A und B miteinander verknüpfen (JOIN), daà auf
> jeden
> Fall alle Elemente von A in Erwägung gezogen werden, auch wenn sie keine
> Entsprechung in B haben (A LEFT JOIN B). Diese Verknüpfung soll anhand des
> gemeinsamen Feldes id geschehen (USING (id) oder ON A.id=B.id).
>
> Angezeigt werden sollen die kombinierten Datensätze, die aktiv sind
> (active=true)[1], jedoch nicht die, die ausgeliehen wurde (für die also
> restitution NULL ist). Allerdings sollen die Datensätze, für die kein
> Eintrag in B existiert und für die also zwar restitution zwar auch NULL
> ist, aber auch alle anderen Felder, dabei nicht berücksichtigt werden.)
>
> Hm, das wird jetzt komplizierter.
>
> Beim Verknüpfen sollten die Datensätze, die "zurückgegeben" anzeigen,
> auÃen
> vor gelassen werden: ON A.id=B.id AND B.restitution IS NULL
>
> Also:
>
> SELECT title FROM A LEFT JOIN B ON A.id=B.id AND B.restitution IS NULL AND
> B.rental IS NOT NULL WHERE
> active='true' /* hier wäre besser: WHERE active != 0 oder so was, je nach
> Datentyp */
> AND B.rental IS NULL
>
> (ungetestet!)
>
>
> Welchen Datentyp hat active?
>
>
> Thomas
> --
> »Herr Schaffner, ist das mein Zug?«
> »Nein, der gehört der DB Reise&Touristik GmbH«
Re: Problem mit einer SQL Abfrage
am 18.09.2006 21:21:46 von Andreas Kretschmer
Andreas
--
q: why do so many people take an instant dislike to mysql?
a: it saves time (oicu in #postgresql)
Explaining the concept of referential integrity to a mysql user is like
explaining condoms to a catholic (Shadda in #postgresql)
Re: Problem mit einer SQL Abfrage
am 18.09.2006 21:31:26 von Claus Reibenstein
Michael Plate schrieb:
> Ich mache gerade ein Beispiel mit einer Verleihliste. In der Tabelle A
> werden alle Positionen aufgelistet, die man verleihen kann. In der zweiten
> Tabelle werden alle Positionen aufgelistet, die gerade unterwegs sind. Ich
> möchte eine Abfrage bilden, die mir alle Positionen anzeigt, die noch zur
> Verfügung stehen.
Also alle aus A, deren ID nicht in B steht?
> Tabelle A
> id | title | active|...
>
> Tabelle B
> id | rental | restituion
select ... from A where id not in (select id from B)
Gruß. Claus
Re: Problem mit einer SQL Abfrage
am 18.09.2006 22:03:48 von Thomas Rachel
Michael Plate wrote:
> ich hab es ein bisschen umständlicher gelöst.
Das sieht man...
> Hier ist die entstandene Anweisung
>
> SELECT a.title
> FROM ( SELECT * FROM A WHERE active is null ) c
> LEFT JOIN ( SELECT * FROM B where restituion is null ) d
> ON a.id=b.id
> WHERE d.restituion is null
Ich kenne mich nicht wirklich mit den Auswirkungen von Subselects aus - sind
die nicht eher teuer? Was bekommst Du denn, wenn Du ein EXPLAIN vor Deinen
Query setzt?
> Die Felder active, rental und restituion sind vom Typ Datum (date) und
> speichert Datum der Deaktivierung (active), Ausleihdatum und
> Rückgabedatum. Ist eher eine Protokollierung.
Ah, ok.
> Gruss
> Michael
>
>
> "Thomas Rachel" schrieb im
> Newsbeitrag news:eemir5$c2n$1@glglgl.ath.cx...
Aber bitte: kein TOFU (=Text oben, Fullquote unten). Das Zitieren im Usenet
dient nur dem Vereinfachen des Leseflusses, dabit man auf den ersten Blick
den Zusammenhang erkennt, ohne umständlich hoch- und runterblättern zu
müssen. Vollzitate sind nicht nötig, der Vorgängerartikel ist ja genauso
einfach abzurufen wie der eigene.
Thomas