schwierige Abfrage

schwierige Abfrage

am 23.03.2006 12:51:16 von Heiko Kramp

Hallo,

ich habe 2 Tabellen:

1. Teilestamm
2. Auftrag

Ich suche alle Teile, die im Auftrag keinen Datensatz haben, dessen
DatumWA(Warenausgang) kleiner des heutigen ist.
Es muß jedoch ein Satz im Auftrag vorhanden sein.

Gibt es da eine Möglichkeit

Danke im Voraus

Re: schwierige Abfrage

am 23.03.2006 13:24:56 von Fabian Schladitz

Heiko Kramp schrieb:
> Hallo,
>=20
> ich habe 2 Tabellen:
>=20
> 1. Teilestamm
> 2. Auftrag
>=20
> Ich suche alle Teile, die im Auftrag keinen Datensatz haben, dessen=20
> DatumWA(Warenausgang) kleiner des heutigen ist.
> Es muß jedoch ein Satz im Auftrag vorhanden sein.
>=20
> Gibt es da eine Möglichkeit

Gib uns doch bitte SHOW CREATE TABLE Teilstamm\G und SHOW CREATE TABLE=20
Auftrag\G. Dann wissen wir, wie die Tabellen ausschauen. Dann sag uns=20
noch, über welche Felder du die Fremdschlüsselbeziehung abbildest.

Dann können wir vielleicht helfen.

--=20
MfG,
Fabian

Re: schwierige Abfrage

am 23.03.2006 13:29:55 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: schwierige Abfrage

am 23.03.2006 13:44:51 von Heiko Kramp

Danke für die schnelle Antwort!

Hier die Creates (auf die wichtigen Felder beschränkt)

CREATE TABLE `teilestamm` (

`dbKey` int(11) NOT NULL auto_increment,

`mandant` int(11) default NULL,

`teilenummer` varchar(30) NOT NULL default '',

PRIMARY KEY (`dbKey`),

UNIQUE KEY `mandant` (`mandant`,`teilenummer`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1



CREATE TABLE `auftrag` (

`dbKeyAuftrag` int(11) NOT NULL auto_increment,

`mandant` int(11) NOT NULL default '0',

`teil` int(11) default NULL,

`DatumWA` date default NULL,

PRIMARY KEY (`dbKeyAuftrag`),

UNIQUE KEY `mandant` (`mandant`,`AuftragsnummerYYYY`,`AuftragsnummerNr`),

KEY `FK3BEFDCB61F7DCAB5` (`abteilung`),

KEY `FK3BEFDCB6191841C5` (`teil`),

KEY `FK3BEFDCB6901000D` (`kunde`),

KEY `KD_Auftrags_Nummer` (`mandant`,`KdAuftragsNr`),

KEY `DatumWA` (`mandant`,`DatumWA`),

CONSTRAINT `FK3BEFDCB6191841C5` FOREIGN KEY (`teil`) REFERENCES `teilestamm`
(`dbKey`),

CONSTRAINT `FK3BEFDCB61F7DCAB5` FOREIGN KEY (`abteilung`) REFERENCES
`abteilung` (`dbKey`),

CONSTRAINT `FK3BEFDCB6901000D` FOREIGN KEY (`kunde`) REFERENCES `kunde`
(`dbKeyKunde`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1



Die Relation wird über teil im Auftrag zum Teilestamm über dbKey erstellt.



Schöne Grüße

"Fabian Schladitz" schrieb im Newsbeitrag
news:dvu491$aj3$1@news.web.de...
Heiko Kramp schrieb:
> Hallo,
>
> ich habe 2 Tabellen:
>
> 1. Teilestamm
> 2. Auftrag
>
> Ich suche alle Teile, die im Auftrag keinen Datensatz haben, dessen
> DatumWA(Warenausgang) kleiner des heutigen ist.
> Es muß jedoch ein Satz im Auftrag vorhanden sein.
>
> Gibt es da eine Möglichkeit

Gib uns doch bitte SHOW CREATE TABLE Teilstamm\G und SHOW CREATE TABLE
Auftrag\G. Dann wissen wir, wie die Tabellen ausschauen. Dann sag uns
noch, über welche Felder du die Fremdschlüsselbeziehung abbildest.

Dann können wir vielleicht helfen.

--
MfG,
Fabian

Re: schwierige Abfrage

am 23.03.2006 13:48:07 von Andreas Scherbaum

Andreas Kretschmer wrote:

> test=# create table auftrag (id serial primary key, teil int references teilestamm);

Menno, Andreas, du kannst doch hier nicht mit fortgeschrittenen
Datenbank Technologien kommen!

Und ausserdem, wenn dann kannst du gleich eine Transaktion
um die DDL-Sachen legen ;-)


> test=# select * from teilestamm where datumwa < current_date and id not in (select teil from auftrag);

Kann die DB für das Feld 'datumwa' einen Index nutzen?
Ansonsten kann es passieren, das die Abfrage langsam wird ...


Bye

--
Andreas 'ads' Scherbaum
Failure is not an option. It comes bundled with your Microsoft product.
(Ferenc Mantfeld)

Re: schwierige Abfrage

am 23.03.2006 14:03:13 von Sven Paulus

Andreas Scherbaum wrote:
> Menno, Andreas, du kannst doch hier nicht mit fortgeschrittenen
> Datenbank Technologien kommen!

Also, zwei Postgresqler, die sich hier gegenseitig bauchpinseln, tuen
irgendwie wirklich keine Not ...

Re: schwierige Abfrage

am 23.03.2006 15:12:50 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: schwierige Abfrage

am 23.03.2006 15:27:01 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: schwierige Abfrage

am 23.03.2006 16:04:54 von Axel Schwenke

Andreas Scherbaum wrote:
> Andreas Kretschmer wrote:
>
>> test=# create table auftrag (id serial primary key, teil int references teilestamm);
>
> Menno, Andreas, du kannst doch hier nicht mit fortgeschrittenen
> Datenbank Technologien kommen!
>
> Und ausserdem, wenn dann kannst du gleich eine Transaktion
> um die DDL-Sachen legen ;-)

Bist du ein alter ego von Andreas K. oder einfach nur ein befreundeter
Troll, den er um Hilfe gebeten hat?

Könntest du nicht eine Transaktion um deine Usenet-Tätigkeiten legen
und ein ROLLBACK mit Fehlermeldung machen, wenn du auf diese, nicht-
transaktionsfähige Newsgroup triffst?


XL

Re: schwierige Abfrage

am 23.03.2006 17:01:58 von Sibylle Koczian

Heiko Kramp schrieb:
> Danke für die schnelle Antwort!
>=20
> Hier die Creates (auf die wichtigen Felder beschränkt)
>=20
> CREATE TABLE `teilestamm` (
>=20
> `dbKey` int(11) NOT NULL auto_increment,
>=20
> `mandant` int(11) default NULL,
>=20
> `teilenummer` varchar(30) NOT NULL default '',
>=20
> PRIMARY KEY (`dbKey`),
>=20
> UNIQUE KEY `mandant` (`mandant`,`teilenummer`)
>=20
> ) ENGINE=3DInnoDB DEFAULT CHARSET=3Dlatin1
>=20
>=20
>=20
> CREATE TABLE `auftrag` (
>=20
> `dbKeyAuftrag` int(11) NOT NULL auto_increment,
>=20
> `mandant` int(11) NOT NULL default '0',
>=20
> `teil` int(11) default NULL,
>=20
> `DatumWA` date default NULL,
>=20
> PRIMARY KEY (`dbKeyAuftrag`),
>=20
> UNIQUE KEY `mandant` (`mandant`,`AuftragsnummerYYYY`,`AuftragsnummerNr`=
),
>=20
> KEY `FK3BEFDCB61F7DCAB5` (`abteilung`),
>=20
> KEY `FK3BEFDCB6191841C5` (`teil`),
>=20
> KEY `FK3BEFDCB6901000D` (`kunde`),
>=20
> KEY `KD_Auftrags_Nummer` (`mandant`,`KdAuftragsNr`),
>=20
> KEY `DatumWA` (`mandant`,`DatumWA`),
>=20
> CONSTRAINT `FK3BEFDCB6191841C5` FOREIGN KEY (`teil`) REFERENCES `teiles=
tamm`=20
> (`dbKey`),
>=20
> CONSTRAINT `FK3BEFDCB61F7DCAB5` FOREIGN KEY (`abteilung`) REFERENCES=20
> `abteilung` (`dbKey`),
>=20
> CONSTRAINT `FK3BEFDCB6901000D` FOREIGN KEY (`kunde`) REFERENCES `kunde`=
=20
> (`dbKeyKunde`)
>=20
> ) ENGINE=3DInnoDB DEFAULT CHARSET=3Dlatin1
>=20
>=20
>=20
> Die Relation wird über teil im Auftrag zum Teilestamm über dbKey er=
stellt.
>=20
>=20
>=20
> Schöne Grüße
>=20
> "Fabian Schladitz" schrieb im Newsbeitrag=20
> news:dvu491$aj3$1@news.web.de...
> Heiko Kramp schrieb:
>=20
>>Hallo,
>>
>>ich habe 2 Tabellen:
>>
>>1. Teilestamm
>>2. Auftrag
>>
>>Ich suche alle Teile, die im Auftrag keinen Datensatz haben, dessen=20
>>DatumWA(Warenausgang) kleiner des heutigen ist.
>>Es muß jedoch ein Satz im Auftrag vorhanden sein.
>>
>>Gibt es da eine Möglichkeit
>=20
>=20

Ich formuliere das mal so um, wie ich es verstanden habe:

- Teil xy kommt in der Tabelle Auftrag mindestens in einem Satz vor
- Alle Sätze der Tabelle Auftrag, in denen Teil xy vorkommt, haben im
Feld DatumWA den heutigen Tag oder einen Termin in der Zukunft.

Richtig?

Einfache Variante, bei der nur der dbKey des Teils ermittelt wird und
keine weiteren Felder aus der Tabelle teilestamm (ungetestet, und
vielleicht schaust Du besser noch mal die HAVING-Klausel nach, mit der
kenne ich mich nicht wirklich aus):

SELECT teil, MIN(DatumWA) AS mdat FROM auftrag GROUP BY teil
HAVING mdat >=3D current_date

Ich bin nicht sicher, ob auch diese Variante funktioniert:

SELECT a.teil, MIN(a.DatumWA) AS mdat, teilestamm> FROM auftrag a
INNER JOIN teilestamm t ON a.teil =3D t.dbKey
GROUP BY teil HAVING mdat >=3D current_date

Problem dabei: ich weiß nicht (und kann es im Augenblick nicht testen),=

ob GROUP BY mit den zusätzlichen Feldern harmoniert. Inhaltlich müsst=
e
das schon gehen, denn alle diese Felder hängen nur von a.teil =3D t.dbK=
ey
ab, haben also für alle durch GROUP BY zusammengefassten Sätze den
gleichen Wert. Aber ist MySQL für diese Erkenntnis schlau genug?

Schöne Grüße,
Koczian

--=20
Dr. Sibylle Koczian
Universitaetsbibliothek, Abt. Naturwiss.
D-86135 Augsburg
e-mail : Sibylle.Koczian@Bibliothek.Uni-Augsburg.DE

Re: schwierige Abfrage

am 23.03.2006 18:12:05 von dnoeth

Heiko Kramp wrote:

> 1. Teilestamm
> 2. Auftrag
>
> Ich suche alle Teile, die im Auftrag keinen Datensatz haben, dessen
> DatumWA(Warenausgang) kleiner des heutigen ist.

-> min(DatumWA) >= current_date

> Es muß jedoch ein Satz im Auftrag vorhanden sein.

-> Inner Join

In Standard SQL:
select
t.dbkey, ...
from auftrag a join teilestamm t
on a.teil = t.dbKey
group by t.dbkey, ...
having min(DatumWA) >= current_date

Dieter

Re: schwierige Abfrage

am 28.03.2006 08:28:05 von Heiko Kramp

Hallo,

ich habe es mit einer UDF in Mysql 5 gelöst.

Danke für die Hilfe!

"Dieter Noeth" schrieb im Newsbeitrag
news:dvukti$98g$1@online.de...
> Heiko Kramp wrote:
>
>> 1. Teilestamm
>> 2. Auftrag
>>
>> Ich suche alle Teile, die im Auftrag keinen Datensatz haben, dessen
>> DatumWA(Warenausgang) kleiner des heutigen ist.
>
> -> min(DatumWA) >= current_date
>
>> Es muß jedoch ein Satz im Auftrag vorhanden sein.
>
> -> Inner Join
>
> In Standard SQL:
> select
> t.dbkey, ...
> from auftrag a join teilestamm t
> on a.teil = t.dbKey
> group by t.dbkey, ...
> having min(DatumWA) >= current_date
>
> Dieter