View Full Version : SQL Ergebniskette
andreaspr@aon.at
21-11-12, 14:58
Probiere es mit TRIM oder im schlechtesten Fall mit SUBSTRING.
lg Andreas
nö, immer 'Ergebnis zu lang'
Mittels SUBSTR solltest du eigentlich einen Teil herausbekommen.
Allerdings ist die Funktion auf 1Mb beschränkt und arbeitet nicht "distinct".
Solltest du also doch mehr Werte haben, liegts nicht am substring sondern an der Verkettung.
Ggf. also vorher per DISTINCT auf eindeutige Werte reduzieren.
Das Ergebnis des sys_connect_by_path kannst du auch vorher casten:
cast(sys_connect_by_path(...) as varchar(nn)) as Text
Siehe auch hier:
http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/topic/db2/rbafzscasys_cby_path.htm?resultof=%22%73%79%73%5f% 63%6f%6e%6e%65%63%74%5f%62%79%5f%70%61%74%68%22%20
Danke,
aber ...
das geht leider auch nicht
hier mal mein Befehl
With x as (Select Row_Number() over(Order By kkmanr, rrn(a)) as seq,
a.* from ankkop a where kkmanr = 38),
y as (Select kkmanr, cast(char(sys_connect_by_path(
Trim(digits(KKLFDN)), ' ')) as varchar(10000)) as Text
from x
Start With kkmanr = 38 and seq = 1
connect by Prior Seq = Seq - 1)
Select kkmanr, Max(Text) as Text
From y
Group By kkmanr
Die Datei hat 6 Sätze mit kkmanr = 38, kklfdn ist 7P 0 definiert
Sql sagt: "Ergebnis zu lang"
Schau mal deinen SQL genau an, da ist ein cast zu viel drin!
Lass mal char(......) weg!
Die Funktion CHAR versucht nämlich einen CAST(... as char(1000000)) und das ist natürlich zu lang!
PS:
Auch der TRIM bei Digits ist unsinnig, da Digits keine Leerzeichen zurückgibt.
Der Hammer, es funktioniert!
Danke!!!!!!
Wenn das jetzt noch jemand erklären könnte ...
ok mit dem 1. With wird eine Arbeitsdatei erstellt, die ...
ok ich versuch mal das SQL Buch zu interwiewen.
Verstanden hab ich es nicht, aber es geht ... Klasse!!
Der glückliche ILEMax
Weiteres siehst du hier:
hierarchical queries (http://publib.boulder.ibm.com/infocenter/iseries/v7r1m0/topic/db2/rbafzhierquery.htm)
Hier ist auch noch ein Artikel zu dem Thema Hierarchische Queries:
Hierarchical Queries with DB2 Connect By (http://www.ibm.com/developerworks/ibmi/library/i-db2connectby/index.html)
Birgitta
ich muß diese tolle sache nochmal aufwärmen.
Während
With x as (Select Row_Number() over(Order By kkmanr, rrn(a)) as seq,
a.* from ankkop a where kkmanr = 38),
y as (Select kkmanr, cast((sys_connect_by_path(
Trim(digits(KKLFDN)), ' ')) as varchar(10000)) as Text
from x
Start With kkmanr = 38 and seq = 1
connect by Prior Seq = Seq - 1)
Select kkmanr, Max(Text) as Text
From y
Group By kkmanr
toll funktioniert, habe ich versucht
mehrere kkmanr's zu selektieren.
With x as (Select Row_Number()
over(Order By kkmanr, rrn(a)) as seq,
a.* from ankkop a where kkmanr between 38 and 50),
y as (Select kkmanr, cast((sys_connect_by_path(
Trim(digits(KKLFDN)), ' ')) as varchar(20000)) as Text
from x
Start With kkmanr = 38 and seq = 1
connect by Prior Seq = Seq - 1)
Select kkmanr, Max(Text) as Text
From y
Group By kkmanr order by 1
im Ergebnis bekomme ich mit kkmanr = 38 das richtige Ergebnis. (5 Nr.)
mit kkmanr 39 aber das von 38 und von 39. (also 7 statt 2 Nr.)
Wenn ich den Start with in der seq verändere, z.B. auf 6, bekomme ich
keine Zeile 38 aber die 39 startet richtig.
Wie kann ich nun das SQL so umbauen, das ich nur die Nr. zu einer kkmanr bekomme, die dazu gehören?
Danke
Der ILEMax
versuch mal das für dich um zu bauen
With x as (Select Row_Number() over(partition
By adadnr, adadn2
) as seq,
a.* from adresp a where (adadnr, adadn2) in(
select susunr, susun2 from schulp where susunr between 5 and 99)),
y as (Select adadnr, adadn2, cast((sys_connect_by_path(
Trim(digits(adadn3)), ' ')) as varchar(10000)) as Text
from x
Start With seq = 1
connect by Prior Seq = Seq - 1 and
Prior adadnr = adadnr and
Prior adadn2 = adadn2 )
Select adadnr, adadn2, max(Text) as Text
From y
group By adadnr, adadn2
Benötige aber auch nen Tip:
Wenn ich das in ein create view packe, bekomme ich einen SQL System fehler
Hat da jemand eine Idee?
Danke
Robi