Mehrere Zeilen wenn Subquery als Ausdruck

Mehrere Zeilen wenn Subquery als Ausdruck

am 17.12.2008 22:41:36 von Michael Prochaska

Hallo,

ich habe folgende Tabellen:
aufträge: id, bezeichnung
auftragpersonal: id, auftragid, personalid, einheiten
abrechnung: id, auftragpersonalid, einheiten, datum


über auftragpersonal wird personal aufträgen zugeteilt und das für =
x=20
einheiten.
in der tabelle abrechnung können sich zu einem personal-auftrag mapping=
=20
mehrere abrechnungseinträge finden, damit kann eine teilabrechnung fü=
r=20
das personal abgebildet werden. am ende müssen die summe der einheiten=20
in abrechnung immer gleich der betreffenden einheiten anzahl in=20
auftragpersonal sein.


Ist es irgendwie möglich sämtliche aufträge für eine bestimmte=20
personalid herauszusuchen, wo einheiten größer ist als die summe der=20
teilabrechnungen ist? also wo noch nicht alles abgerechnet ist....

folgendes funktioniert nicht, weil die subquery nicht mehr als eine=20
zeile haben darf (FEHLER: als Ausdruck verwendete Unteranfrage ergab=20
mehr als eine Zeile):
select aufträge.id, aufträge.bezeichnung from aufträge inner join=20
auftragpersonal on aufträge.id=3Dauftragpersonal.auftragid where=20
personalid=3Dx AND auftragpersonal.einheiten > (select=20
SUM(abrechnung.einheiten) from abrechnung group by auftragpersonalid);


Gibt es dafür auf Datenbankebene überhaupt eine Lösung?

MfG,
Michael

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: Mehrere Zeilen wenn Subquery als Ausdruck

am 17.12.2008 23:41:59 von Tim Landscheidt

Michael Prochaska wrote:

> [...]
> folgendes funktioniert nicht, weil die subquery nicht mehr
> als eine zeile haben darf (FEHLER: als Ausdruck verwendete
> Unteranfrage ergab mehr als eine Zeile):
> select aufträge.id, aufträge.bezeichnung from aufträge inner
> join auftragpersonal on
> aufträge.id=3Dauftragpersonal.auftragid where personalid=3Dx AND
> auftragpersonal.einheiten > (select
> SUM(abrechnung.einheiten) from abrechnung group by
> auftragpersonalid);

> Gibt es dafür auf Datenbankebene überhaupt eine Lösung?

Du musst in dem Subselect auf Übereinstimmung mit der über-
geordneten Abfrage prüfen, also (ungetestet) "WHERE [...]
AND auftragpersonal.einheiten > (SELECT
SUM(abrechnung.einheiten) FROM abrechnung WHERE
auftragpersonalid =3D auftragpersonal.id)".

Tim

P. S.: Sorry für die doppelte Mail.

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: Mehrere Zeilen wenn Subquery als Ausdruck

am 18.12.2008 00:26:11 von Michael Prochaska

Das wars, danke!

MfG,
Michael

Tim Landscheidt schrieb:
> Michael Prochaska wrote:
>
> =20
>> [...]
>> folgendes funktioniert nicht, weil die subquery nicht mehr
>> als eine zeile haben darf (FEHLER: als Ausdruck verwendete
>> Unteranfrage ergab mehr als eine Zeile):
>> select aufträge.id, aufträge.bezeichnung from aufträge inner
>> join auftragpersonal on
>> aufträge.id=3Dauftragpersonal.auftragid where personalid=3Dx AND
>> auftragpersonal.einheiten > (select
>> SUM(abrechnung.einheiten) from abrechnung group by
>> auftragpersonalid);
>> =20
>
> =20
>> Gibt es dafür auf Datenbankebene überhaupt eine Lösung?
>> =20
>
> Du musst in dem Subselect auf Übereinstimmung mit der über-
> geordneten Abfrage prüfen, also (ungetestet) "WHERE [...]
> AND auftragpersonal.einheiten > (SELECT
> SUM(abrechnung.einheiten) FROM abrechnung WHERE
> auftragpersonalid =3D auftragpersonal.id)".
>
> Tim
>
> P. S.: Sorry für die doppelte Mail.
>
> =20


--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: Mehrere Zeilen wenn Subquery als Ausdruck

am 18.12.2008 01:46:11 von Michael Prochaska

Hallo nochmal, zu früh gefreut....

Damit bekomme ich leider nur jene Aufträge, zu denen es schon Einträg=
e=20
gibt in der Abrechnungstabelle. Ich brauche also praktisch eine Left=20
Join Funktionalität für die Beziehung zwischen Haupt Query und Sub=20
Query, oder?

MfG,
Michael



Michael Prochaska schrieb:
> Das wars, danke!
>
> MfG,
> Michael
>
> Tim Landscheidt schrieb:
>> Michael Prochaska wrote:
>>
>> =20
>>> [...]
>>> folgendes funktioniert nicht, weil die subquery nicht mehr
>>> als eine zeile haben darf (FEHLER: als Ausdruck verwendete
>>> Unteranfrage ergab mehr als eine Zeile):
>>> select aufträge.id, aufträge.bezeichnung from aufträge inner
>>> join auftragpersonal on
>>> aufträge.id=3Dauftragpersonal.auftragid where personalid=3Dx AND
>>> auftragpersonal.einheiten > (select
>>> SUM(abrechnung.einheiten) from abrechnung group by
>>> auftragpersonalid);
>>> =20
>>
>> =20
>>> Gibt es dafür auf Datenbankebene überhaupt eine Lösung?
>>> =20
>>
>> Du musst in dem Subselect auf Übereinstimmung mit der über-
>> geordneten Abfrage prüfen, also (ungetestet) "WHERE [...]
>> AND auftragpersonal.einheiten > (SELECT
>> SUM(abrechnung.einheiten) FROM abrechnung WHERE
>> auftragpersonalid =3D auftragpersonal.id)".
>>
>> Tim
>>
>> P. S.: Sorry für die doppelte Mail.
>>
>> =20
>
>


--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.o=
rg)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein

Re: Mehrere Zeilen wenn Subquery als Ausdruck

am 18.12.2008 03:34:20 von Tim Landscheidt

Michael Prochaska wrote:

> Hallo nochmal, zu früh gefreut....

> Damit bekomme ich leider nur jene Aufträge, zu denen es
> schon Einträge gibt in der Abrechnungstabelle. Ich brauche
> also praktisch eine Left Join Funktionalität für die
> Beziehung zwischen Haupt Query und Sub Query, oder?

Das Problem ist ein anderes: Wenn keine Datensätze vorhanden
sind, gibt SUM() in dem Subselect NULL zurück, das dann über
"AND $IRGENDWAS > NULL" immer für ein Fehlschlagen der
WHERE-Klausel in der Hauptabfrage sorgt. Wenn Du
"SUM(abrechnung.einheiten)" durch
"COALESCE(SUM(abrechnung.einheiten), 0)" ersetzt (oder das
COALESCE() um das Subselect schreibst), sollte es funktio-
nieren (ungetestet).

Tim

--=20
Sent via pgsql-de-allgemein mailing list (pgsql-de-allgemein@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-de-allgemein