Komplexe Abfrage

netprog

Grünschnabel
Hallo, liebe Forengemeinde.

Ich steh mal wieder vor einem Problem, und zwar hab ich eine Tabelle welche in Delphi in einem Tree angezeigt wird mit folgendem Aufbau:

ID | PARENTID | PROJECTID | BEZEICHNUNG
1 |0| 19| EG
2 |1| 19| Achse A-D
3 |1| 19| Achse E-G
4 |0| 19| 1. OG
5 |4| 19| Achse A-D
6 |4| 19| Achse E-G
usw.


Und wird demnach als Tree anhand PARENTID so angezeigt wird:

EG
- Achse A-D
- Achse E-G
1.OG
- Achse A-D
- Achse E-G

In einer weiteren Tabelle habe ich jeweils ein Aufmaßblatt mit folgendem Aufbau:

ID | PROJECTID | GRUPPE | BEZEICHNUNG | ABMESSUNGEN
1 | 19 | 2 | Wand 1 | 3,45 * 3,36
2 | 19 | 3 | Wand 2 | 7,31 * 3,36
3 | 19 | 6 | Wand 1 | 2,25 * 1,25
usw.

Nun zu meinem eigentlichen Problem , ich zeige nun mit folgendem SQL-Code die Gruppen an
zu denen noch kein Eintrag in der Aufmaßblatttabelle vorhanden ist.
Störend ist nur, sollte schon zu allen Kindeinträgen (PARENTID <> 0) bsp. im EG , Einträge im Aufmaßblatt vorhanden
sein, so wird dennoch der Elterneintrag (PARENTID = 0) als EG im Tree angezeigt.
Wie bekomme ich es hin, das halt nur Elterneinträge angezeigt werden wo auch Kindereinträge vorhanden sind.

SQL:
SELECT
	Gruppen.ID,
	Gruppen.PARENTID,
	Gruppen.ProjektID,
	Gruppen.Bezeichnung
FROM
	Gruppen
	LEFT JOIN (
		SELECT DISTINCT 
			Aufmasse.ProjektID,
			Aufmasse.Gruppe
		FROM
			Aufmasse
		WHERE
			Aufmasse.ProjektID = 19
	) AS GrAbfrage
	ON Gruppen.ID = GrAbfrage.Gruppe
WHERE
	GrAbfrage.Gruppe IS NULL
	AND Gruppen.ProjektID = 19

Vielen Dank schonmal für Eure Hilfestellungen und einen guten Rutsch ins Jahr 2012.
 
Zuletzt bearbeitet von einem Moderator:
item: Willkommen im Forum

item: Ich habe mal dein SQL formatiert und in SQL-Tags gesetzt

item: Annahme meinerseits: Es handelt sich um MySQL

item: Ich poste später ein Vorschlag..
 
@Yaslaw

Danke schonmal für Deine Antwort zu meinem Problem.

Zu meinem Code, ich benutze diesen wie gesagt beim programieren in Delphi.
Die Syntax entspricht MySQL.

MfG
 
MySQL-Syntax oder MySQL? Nun, mit Variablen kann man tolle Dinge machen.

Ich liebe solche Denksportaufgaben *g*

SQL:
SELECT
	grp.*,
	-- Speichern ob der Block immer noch komplet ist
	@block_complet := 
			-- prüfen ob ein aufmass vorhanden ist
			NOT am.gruppe IS NULL 
			-- prüfen ob der gesammte Block bissher komplet war
			AND @block_completD 
		AS set_block_complet
FROM
	-- Variablen initialisieren
	(SELECT @block_complet:=TRUE) AS vars,
	-- Gruppe nach Block und anschliessend nach id absteigend sortiert
	(
		SELECT
			*,
			IF(parentid=0, id, parentid) AS block
		FROM
			gruppen 
		WHERE
			projectid = 19
		ORDER BY
			IF(parentid=0, id, parentid),
			parentid DESC
	) AS grp
	LEFT JOIN aufmasse AS am
		ON grp.id = am.gruppe
		AND grp.projectid = am.projectid
WHERE
	-- Falls es sich um ein Parent handelt, das resultat der block-Auswertung, 
	-- ansonsten eine normale Auswertung auf die aufmasse
	IF(grp.parentid = 0, !@block_complet, am.gruppe IS NULL)
 
Zuletzt bearbeitet von einem Moderator:
Danke für Deinen Supi Lösungsvorschlag, leider hab ich wieder ein neues Problem:

Ich kann leider keine Variablen verwenden, da ich doch glatt gestern Abend verwirrender Weise geschrieben hab das ich die MySQL - Syntax benutze. Dabei handelt es sich doch um eine Access-Datenbank auf die mitels ADO zugegriffen wird. Sorry war mein Fehler, wenn man nicht so recht bei der Sache ist, da das liebe Kind mit Magenschmerzen und Übelkeit zukämpfen hatte.

Dennoch hoffe ich das es auch dafür eine Lösung gibt.

MfG
netprog
 
MS Access? oh - also abgespecktes SQL ohne weiterreichende Möglichkeiten. Leider habe ich sehr viel Erfahrung mit MS Access SQL. Unterabfragen sind nur möglich indem man sie einzeln speichert. Komplexere SQL-Funktionen sind nur möglich wenn man sie selber in VBA hinterlegt.
Ich denke es ist einfacher in Delphi die ausgelesen Daten mit einer Schleife nachzuprüfen als das mit MS Access-SQL lösen zu wollen.

Also erweitere dein SQL um die Block-sortierung und FLags für Vollständigkeit und Parent
SQL:
SELECT
    grp.*,
    am.gruppe IS NULL AS have_aufmass,
    grp.parentid=0 AS is_parent
FROM
    gruppen AS grp
 	LEFT JOIN aufmasse AS am
		ON grp.id = am.gruppe
		AND grp.projectid = am.projectid
WHERE
    grp.projectid = 19
ORDER BY
    IIF(grp.parentid=0, grp.id, grp.parentid),
    parentid DESC
	LEFTAND grp.projectid = am.projectid;

Diesen dann innerhalb von Delphi mit einer schleife durchgehen. Ich kann kein Delphi, aber so wäre die Logik:
Code:
[block_complet] = true
[items] = array()
foreach [row] in [rows]
	-- FLag setzen, dass kein Aufmass vorhanden ist
	[missung_aufmass] = not [row]![have_aufmass]
	-- Wenn es kein Parent ist und bisher der Block komplett ist, 
	-- erneut prüfen ob der Block immer noch komplett ist.
	if not [row]![is_parent] and [block_complet] then
		[block_complet] = [row]![have_aufmass]
	else
	-- Bei einem Parent den Flag übernehmen und den block_complet zurücksetzen
		[missung_aufmass] = not [block_complet]
		[block_complet] = true
	end if

	-- Falls der Flag gesetzt ist, die ganze Zeile dem Array mit allen unvollständigen Items hinzufügen
	if [missung_aufmass] then
		[items].add([row])
	end if

next [row]
 
Zuletzt bearbeitet von einem Moderator:
@Yaslaw

Danke nochmals für Deine schnelle Unterstützung.
Ich werde das ganze in den nächsten Tagen mal in Ruhe testen und mich dann wieder melden.
Werde mich erstmal um meine Kranke kleine Maus kümmern.

Also bis denn ....
 
Zurück