SQL-Formulierung für Teilmenge? gesucht
Jannes
- datenbank
0 Frank (no reg)0 Jannes0 Vinzenz Mai0 Jannes
Hallo zusammen,
vorweg: ich nix wirklich verstehen Datenbanken!
Ich habe hier eine Tabelle zur Verwaltung von Angeboten, Rechnungen etc.
Felder sind:
uid
projektnummer
vorgang
datum
... usw
Datensätze mit selbiger projektnummer können mehrmals vorkommen.
vorgang hat Werte aus der Liste: ANG,AUF,LIE,RNG,MNG
Ich möchte alle Projekte finden in denen entweder ANG und/oder AUF existiert, aber noch kein Datensatz mit vorgang=RNG. Hiervon soll entweder der Datensatz AUF angezeigt werden, oder, falls nicht existent, das ANG mit dem jüngsten Datum.
Ich kann nur einfache Abfragen definieren, wie z.B. "SELECT uid,kundennummer,rngnummer FROM tabelle WHERE zahlungseingang=0;" ;-)
Zu den Projekten können z.B. nur ein oder mehrere Datensätze mit ANG gespeichert sein,
oder wie oben und zusätzlich ein AUF
und es gibt auch Projekte nur meit einer RNG. (das sind meine liebsten)
Kann man das in einer SQL-Definition unterbringen? (DB = MS-Access)
Gruss, Jannes
Hi,
mit korrelierenden Unterabfragen und dem EXISTS Prädikat. Das sollte Access durchaus können
SELECT distinct projekt -- und andere distinct spalten
FROM t1
WHERE exists(SELECT * FROM t2 WHERE t2.projekt = t1.projekt and (t2.vorgang = 'ANG' OR t2.vorgang = 'AUF')
AND not exists(SELECT * FROM t2 WHERE t2.projekt = t1.projekt and (t2.vorgang = 'RNG')
Die Korrelation erfolgt über die spalte projekt ...
Mit 2 Joins sollte es auch gehen, ja.
HTH, Ciao, Frank
Hallo Frank,
habe die Definition ausprobiert. Habe weitere erforderliche distinct Spalten eingesetzt und fehlende abschliessende Klammern für die exists gesetzt:
SELECT distinct projekt, vorgang, uid
FROM t1
WHERE exists(SELECT * FROM t2 WHERE t2.projekt = t1.projekt and (t2.vorgang = 'ANG' OR t2.vorgang = 'AUF'))
AND not exists(SELECT * FROM t2 WHERE t2.projekt = t1.projekt and (t2.vorgang = 'RNG'));
Sieht soweit gut aus. Access befindet die Definition fehlerfrei. Nur wenn ich sie ausführen will, wird die unbekannte Tabelle t2 bemeckert.
Was/Wo ist die t2?
Gruss, Jannes
Hallo
habe die Definition ausprobiert. Habe weitere erforderliche distinct Spalten eingesetzt und fehlende abschliessende Klammern für die exists gesetzt:
SELECT DISTINCT
projekt,
vorgang,
uid
FROM
<deine tabelle> t1 -- t1 ist ein Aliasname für die Tabelle aus der
-- Du auswählst
WHERE EXISTS(
SELECT
*
FROM
<deine tabelle> t2 -- hier greifst Du doch auf die gleiche Tabelle
-- zu, daher musst Du einen anderen Aliasnamen
-- wählen, damit in der WHERE-Klausel Klarheit
-- herrscht, was mit wem verglichen wird.
WHERE
t2.projekt = t1.projekt
AND (t2.vorgang = 'ANG' OR t2.vorgang = 'AUF')
)
-- [...]
Sieht soweit gut aus. Access befindet die Definition fehlerfrei. Nur wenn ich sie ausführen will, wird die unbekannte Tabelle t2 bemeckert.
Was/Wo ist die t2?
Ein Aliasname für Deine Tabelle.
Bei Access habe ich in der Tat noch nicht ausprobiert, ob die Jet-Engine Kommentare versteht.
Freundliche Grüße
Vinzenz
Hi Vinzenz,
Was/Wo ist die t2?
Ein Aliasname für Deine Tabelle.
=:) Supi! Jetzt geht's.
Bei Access habe ich in der Tat noch nicht ausprobiert, ob die Jet-Engine Kommentare versteht.
Bei mir nicht, wie es scheint
Gruss, Jannes