[db2] Spalten auffüllen

oraclin25

Erfahrenes Mitglied
Hallo zusammen,

ich habe eine Tabelle mit lediglich 2 Spalten:
Code:
ID       FREMD_ID
-----------------------
001       xx
002       xx
004       xx
007       yy
008       xy
021       xx
...
...
999       xy

Man sieht, dass der Inhalt der Tabelle lediglich eine Dimension von 001 bis 999 hat.

Ich würde gerne die "Lücken" gerne auffüllen, so dass am Ende die Tabelle wie folgt aussieht:
Code:
ID       FREMD_ID
-----------------------
001       xx
002       xx
003       bezugsfrei
004       xx
005       bezugsfrei
006       bezugsfrei
007       yy
008       xy
009       bezugsfrei
...
...
999       xy

Hat jemand vielleicht eine Idee, wie ich mit SQL die Lücken auffüllen?

Vielen Dank für die Hilfestellungen.

Viele Grüße aus Rheinland,

Eure Ratna:p
 
Moin oraclin25,

als Ansatz mal ein Statement, mit dem du die "fehlenden" Einträge erzeugen könntest
SQL:
WITH NUMBERS (LEVEL) AS
(
SELECT 10001
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT LEVEL + 1
FROM NUMBERS
WHERE LEVEL < 11000
)
, ZielTab (Id, Fremd_id)
as (      select '001', 'xx' from sysibm.sysdummy1
union all select '002', 'xx' from sysibm.sysdummy1
union all select '004', 'xx' from sysibm.sysdummy1
union all select '007', 'xx' from sysibm.sysdummy1
union all select '008', 'xx' from sysibm.sysdummy1
union all select '021', 'xx' from sysibm.sysdummy1
)
SELECT substr(to_char(LEVEL), 3, 3)  AS strID, 'bezugsfrei' as newFremdID
FROM NUMBERS
where substr(to_char(LEVEL), 3, 3) not in (select id from Zieltab)
ORDER BY LEVEL;

Ausgabe wäre in dieser Demo:
STRID NEWFREMDID
003 bezugsfrei
005 bezugsfrei
006 bezugsfrei
009 bezugsfrei
010 bezugsfrei
011 bezugsfrei
012 bezugsfrei
013 bezugsfrei
014 bezugsfrei
015 bezugsfrei
016 bezugsfrei
017 bezugsfrei
018 bezugsfrei
019 bezugsfrei
020 bezugsfrei
022 bezugsfrei
023 bezugsfrei
024 bezugsfrei
025 bezugsfrei
026 bezugsfrei
027 bezugsfrei
028 bezugsfrei
029 bezugsfrei
030 bezugsfrei
.....

Du müsstest bei dir natürlich anpassen
- den Zugriff auf deine vorhandene Zieltabelle statt meiner virtuellen "Zieltab"
- und natürlich statt der Ausgabe ein "INSERT INTO DeineZielTab( ID, FREMD_ID) ... das Select oben.."

Grüße
Biber
 
Zuletzt bearbeitet:
P.S.

Sorry, ich habe beim nochmaligen Meditieren natürlich jetzt verstanden, dass du mit "Auffüllen" nur die Auflistung aller IDs des Nummernkreises meintest und nicht das INSERTen von Dummysätzen für nicht zugeordnete.


Dann wäre das Beispiel also etwas anders:
SQL:
WITH NUMBERS (LEVEL) AS
(
SELECT 10001
FROM SYSIBM.SYSDUMMY1
UNION ALL
SELECT LEVEL + 1
FROM NUMBERS
WHERE LEVEL < 11000
)
, ZielTab (Id, Fremd_id)
as (      select '001', 'xx' from sysibm.sysdummy1
union all select '002', 'xx' from sysibm.sysdummy1
union all select '004', 'xx' from sysibm.sysdummy1
union all select '007', 'xx' from sysibm.sysdummy1
union all select '008', 'xx' from sysibm.sysdummy1
union all select '021', 'xx' from sysibm.sysdummy1
)
SELECT substr(to_char(LEVEL), 3, 3)  AS ID, 'bezugsfrei' as Fremd_ID
      FROM NUMBERS
      where substr(to_char(LEVEL), 3, 3) not in (select id from Zieltab)
 Union all 
    select id,  Fremd_id from Zieltab
    
ORDER BY 1;

mit dieser Ausgabe:
ID FREMD_ID
001 xx
002 xx
003 bezugsfrei
004 xx
005 bezugsfrei
006 bezugsfrei
007 xx
008 xx
009 bezugsfrei
010 bezugsfrei
011 bezugsfrei
012 bezugsfrei
013 bezugsfrei
014 bezugsfrei
015 bezugsfrei
016 bezugsfrei
017 bezugsfrei
018 bezugsfrei
019 bezugsfrei
021 xx
...

Grüße
Biber
 
Hallo Biber3,

vielen lieben Dank für den Code, hat super funktioniert, ich habe jetzt eine vollständige Menge zu der Tabelle.

Viele Grüße aus Rheinland,

Eure Ratna
 
Zurück