PDA

View Full Version : SQL rekursiv ?



wolfinho
15-01-10, 10:13
Hallo zusammen,

ich habe folgende Herausforderung. Es handelt sich um 2 Tabellen. Die eine Tabellen enthält nur die Kundennummer. Die 2. Tabelle enthält ebenfalls die Kundennummer und eine bestimmte Eigenschaft des Kunden. Allerdings kann es x-Eigenschaften eines Kunden geben. Also eine 1:n-Beziehung.

Kann ich aus den beiden Tabellen mit SQL-Anweisungen eine Ergebniszeile mit dem folgenden Format: KUNR, Eigenschaft1, Eigenschaft2, ...... bilden ?

Allerdings ist die Anzahl der Eigenschaften nicht für alle Kunden gleich. Es gibt Kunden mit nur einer Eigenschaft, oder Kunden mit 10 Eigenschaften.

Kann ich hier mit Rekursion arbeiten ?

Fuerchau
15-01-10, 11:06
Ein ähnliches Thema hatten wir hier schon mal.
Du musst dir dafür eine SQL-Funktion schreiben, die selber einen Select auf die 2. Tabelle macht, die einzelnen Werte mit Conact in eine Variable zusammenschiebt und dann zurückgibt.

PS:
Ab Firebird 2.1 gibts da die Aggregatfunktion LIST.

wolfinho
19-01-10, 13:01
Super. Vielen Dank für die Info.
Habe die Stelle im Forum auch bereits gefunden und die Funktion auf meine Bedürfnisse abgeändert.

Leider bekomme ich bei der Erstellung der Funktion den Syntax-Fehler TOKEN ';' ungültig.

Ich habe die Funktion bereits mehrfach geprüft, komme aber nicht auf den Fehler. Ich muss dazu sagen, dass dies nach der Funktion "HELLO" erst meine 2. UDF ist.

Hier die Funktion:

CREATE FUNCTION yc03xf5.ROW2COL ( PARIdVoBew VARChar(255) )

RETURNS VARCHAR(2048)
LANGUAGE SQL
NOT DETERMINISTIC
READS SQL DATA
CALLED ON NULL INPUT
BEGIN
DECLARE RETURNVAL VARCHAR ( 2048 ) NOT NULL DEFAULT ' ' ;
FOR CSRC1 AS C1 CURSOR
FOR SELECT (trim(t2.bezei00001) !! ':' !! ' ' !!
digits(t1.wert) !! ' - ') as TEXT
FROM kessprod14.g_mer00001 t1
join kessprod14.g_bew00001 t2
on t1.id_merkmal = t2.id
WHERE id_vo00001 = PARIdVoBew

DO SET ReturnVal = ReturnVal CONCAT ' ' CONCAT CsrC1.Text;
END FOR ;
RETURN LTRIM(ReturnVal) ;
END;

Kann jemand den Fehler erkennen ?

Vielen Dank für Eure Hilfe.

woodstock99
19-01-10, 13:11
beim letzten end kommt doch keines..
also die letzte zeile

wolfinho
19-01-10, 13:12
peinlich, aber das wars.
bin halt doch noch ein rookie
danke dafür