# [Oracle] SQL Abfrage leere / fehelnde Zeilen hinzufügen



## wraith01 (24. April 2012)

Hallo,
ich habe folgendes Problem.

Ausgang ist eine Tabelle Kunde die wie folgt aussieht:

id, ordernr, name

Die Daten sind zum Beispiel:

ID           ORDERNR         NAME
--------------------------------------
1             1                      Müller
2             2                      Thomas
3             4                      Max
4             5                      Dieter
5             7                      Alf
6             9                      Duncan
7             10                    Connor
8             14                    Chris


Ich benötige eine SQL Abfrage, welche mir die "Lücken" bei der ORDERNR auffülllt.
D.h. Das Ergebnis meiner Abfrage z.B select * from kunde
soll so aussehen:

 ORDERNR         NAME
--------------------------------------
1                      Müller
2                      Thomas
3
4                      Max
5                      Dieter
6
7                      Alf
8
9                      Duncan
10                    Connor
11
12
13
14                    Chris


Kann mir da jemand helfen********?

Beste Grüße,


----------



## Yaslaw (24. April 2012)

Oracle, MySQL, MS Access, SQL Lite, MS SQL, Peregraine......
Bitte wähle eine DBMS aus

Nachtrag:
Hab den Titel entsprechend ergänzt


----------



## Funresort (24. April 2012)

Das kannst du rein sql technisch grad nicht ändern, bzw. wenn nur mit viel Aufwand. Wenn du mir sagst was für ne Programmiersprache kann ich dir glaub helfen^^


----------



## wraith01 (24. April 2012)

Sorry,

habe ich ganz vergessen. Ich arbeite mit Oracle 10g.

Beste Güße,


----------



## wraith01 (24. April 2012)

Ich benötige da das "reine" SQL,
da ich diesen dann in Birt Report nutzen will/muss. Der Aufwand, der hierfür nötig ist
ist erst einmal völlig egal.

Beste Güße,


----------



## Funresort (24. April 2012)

da kommste aber glaub nicht ums programmieren rum, da wird wahrscheinlich kein reines sql gehen, bzw. theoretisch könntest du nen eigenes programm schreiben das das macht, aber musst halt jedes mal ausführen wenn du die tabelle sich verändert hat, das meinte ich mit aufwand


----------



## Yaslaw (24. April 2012)

Mittels PL/SQL eine Tabelle erstellen und alle IDs bis zur höchsten ID deiner Tabelle einfügen. Dann ein LEFT JOIN von der ID-Tabelle zur Datentabelle.


----------



## wraith01 (24. April 2012)

Hi,

ich hatte mir da so einen Ansatz überlegt. Es git bei mir noch mehre Tabellen mit bis zu 10000 und mehr
Records. Könnte ich da nicht folgendes machen?

Die Abfrage für z.B.:  select ordernr, name from kunde

                                 mit

                                 select rownum from artikel where rownum <15

verbinde?

JOIN ****?

Beste Grüße,



Hallo noch ein Nachtrag:


http://www.tutorials.de/relationale-datenbanksysteme/386825-sql-anweisung-mit.html

geht da was mit einem LEFT JOIN ****?


----------



## Funresort (24. April 2012)

stimmt jaslaw daran hatte ich garnicht gedacht, das müsste klappen.
verstehe nicht was du genau meinst wraith01


----------



## wraith01 (24. April 2012)

Hi,
hatte mir das eventuell so gedacht.

Mit select rownum ....  bekomme ich doch soetwas wie eine fortlaufende Nummer.
Diese könnte ich in die Spalte ORDERNR schreiben.

z.B.

ORDERNR
------------
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Mit einer Abfrage auf kunde bekomme ich den name mit zugehörger ordernr,
beide select's zusammen legen. Wie auch immer damit es so aus sieht:

ORDERNR NAME
--------------------------------------
1 Müller
2 Thomas
3
4 Max
5 Dieter
6
7 Alf
8
9 Duncan
10 Connor
11
12
13
14 Chris


----------



## Yaslaw (24. April 2012)

Du kannst die ID-Tablle auch über einen Trigger der Datentabelle steuern. Bei jeder Änderung (INSERT/DELETE) werden die Daten der ID-Tabelle angepasst.

@wraith01
Meien Lösung baut auf dem gleichen - ausser dass die IDs nach bedarf gefüllt werden und nicht einfach mal zig IDs reingeschrieben werden. Das Problem ist, wenn in - sagen wir mal 5 Jahren - die ID höher als die grösste ID deiner Tabelle wird, kein Schwein sich daran erinnert dass da eine Tabelle mit vielen Zahlen drin vorhanden ist.


----------



## wraith01 (24. April 2012)

Hi,
ja danke dir für die Antwort. Die ORDERN ist keine ID. Die stellt dar wann eine Order Bestellung eingegangen ist (wie eine Reinfolge). Ein Trigger geht leider nicht, da ich nur "Lese Rechte" auf dem Schema habe.

Beste Grüße,


----------



## Yaslaw (24. April 2012)

In dem Fall kannst du nicht mal eine Tabelle ORDERNR anlegen.


----------



## Yaslaw (24. April 2012)

*Bong* Ist ja Oracle....
Da kann man ja mittels dem folgenden Script leere imaginäre Zeilen erstellen

```
-- 100 Zeilen mit dem Wert von 1 bis 100
select rownum id
  from dual
connect by rownum <= 100;
```

Nun müssen wir nur noch die Obergrenze dynamich gestalten und die Daten mit LEFT JOIN anhängen

etwa so müsste das nun gehen

```
-- Alle Ordernr von 1 bis (grösste ordernr von Kunde) erstellen
WITH ordernr_list AS (
  SELECT 
    ROWNUM AS ordernr
  FROM
    dual,
    -- Die grösste ordernr auslesen
    (SELECT MAX(ordernr) AS max_ordernr FROM kunde) src
  CONNECT BY ROWNUM <= src.max_ordernr
)
-- Und diese Liste mit den Daten aus [kunde] verknüpfen und ausgeben
SELECT
    -- die ordernr aus der Liste nehmen
  ordernr_list.ordernr,
    -- Hier alle gewünschten Felder aus der Tabelle [kunde] auflisten
  kunde.name
FROM
  -- Resultat vom WITH-Bereich
  ordernr_list
  -- Datenquelle
  LEFT JOIN kunde
  ON ordernr_list.ordernr = kunde.ordernr
-- Alles in aufsteigend Reihenfolge bringen
ORDER BY 
  ordernr_list.ordernr;
```


----------

