Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Alle Werte zwischen zwei ZAhlen mit SQL ausgeben (https://www.delphipraxis.net/122447-alle-werte-zwischen-zwei-zahlen-mit-sql-ausgeben.html)

barnti 16. Okt 2008 09:57

Datenbank: Oracle • Version: 10 • Zugriff über: PL/SQL

Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Hallo zusammen,

ich möchte aus einer Tabelle mit zwei Spalten alle Werte einzeln ausgegeben bekommen, die in diesem Interval der beiden Spalten liegen(incl der Intervalgrenzen). Z.B.:

Spalte_A | Spalte_B

100 | 110


Ergebnis:

100
101
102
103
104
105
106
107
108
109
110

Geht so etwas mit einem SQL-Statement oder muss ich da auf PL/SQL zurückgreifen? Hat jemand eine Idee?

DeddyH 16. Okt 2008 10:56

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Einen interessanten Ansatz habe ich hier gefunden:http://problemlos.ch/wp/2006/03/31/o...ql-zaubereien/

barnti 16. Okt 2008 11:02

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Hi,

Zitat:

Zitat von DeddyH
Einen interessanten Ansatz habe ich hier gefunden:http://problemlos.ch/wp/2006/03/31/o...ql-zaubereien/

Echt beeindruckend! Jetzt muss ich es nur noch verstehen damit ich es für meine Zwecke gebrauchen kann!

Danke!

nahpets 16. Okt 2008 12:29

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Hallo,

nur ein Schnellschuß:

SQL-Code:
select MeinstDuDas from
(
  SELECT LEVEL MeinstDuDas
  FROM test
  CONNECT BY LEVEL <= greatest(Spalte_a,Spalte_b)
) where MeinstDuDas > (select Least(Spalte_a,Spalte_b) from test)

barnti 16. Okt 2008 12:30

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Hi,
ich habe mit dem Tip folgende Abfrage zusammen gestellt:
SQL-Code:
SELECT l FROM (
                SELECT LEVEL l FROM dual CONNECT BY LEVEL < = (
                                    SELECT a.rb_endnummer AS endIndex
                                      FROM MeineTabelle a
                                     WHERE a.rb_anfangsnummer = '1396000')
               )

WHERE l >= (
                                    SELECT a.rb_anfangsnummer AS startIndex
                                      FROM MeineTabelle a
                                     WHERE a.rb_anfangsnummer = '1396000')
Das Problem: Ich bekomme immer nur für einen Eintrag(1396000) aus meiner Tabelle die Werte aufgelistet. Wie kann ich das für alle Einträge aus der Tabelle erweitern?

nahpets 16. Okt 2008 13:35

Re: Alle Werte zwischen zwei Zahlen mit SQL ausgeben
 
Hallo,
Zitat:

Zitat von barnti
SQL-Code:
SELECT l FROM (
                SELECT LEVEL l FROM dual CONNECT BY LEVEL < = (
                                    SELECT a.rb_endnummer AS endIndex
                                      FROM MeineTabelle a
                                     WHERE a.rb_anfangsnummer = '1396000')
               )

WHERE l >= (
                                    SELECT a.rb_anfangsnummer AS startIndex
                                      FROM MeineTabelle a
                                     WHERE a.rb_anfangsnummer = '1396000')
Das Problem: Ich bekomme immer nur für einen Eintrag(1396000) aus meiner Tabelle die Werte aufgelistet. Wie kann ich das für alle Einträge aus der Tabelle erweitern?

befürchte, dass das nicht geht, da die inneren Selects nur eine Zeile als Ergebnis liefern dürfen.
Momentan fällt mir da nur ein - Schleife drum machen, für nur SQL weiß ich keine Lösung, eigentlich Schade, wäre sonst so schön einfach.

Schaumal, ob die Dir 'ne Idee liefern können: www.sqlsnippets.com

barnti 16. Okt 2008 13:38

Re: Alle Werte zwischen zwei Zahlen mit SQL ausgeben
 
Hi,
Zitat:

Zitat von nahpets
Das Problem: Ich bekomme immer nur für einen Eintrag(1396000) aus meiner Tabelle die Werte aufgelistet. Wie kann ich das für alle Einträge aus der Tabelle erweitern?
befürchte, dass das nicht geht, da die inneren Selects nur eine Zeile als Ergebnis liefern dürfen.
Momentan fällt mir da nur ein - Schleife drum machen, für nur SQL weiß ich keine Lösung, eigentlich Schade, wäre sonst so schön einfach.

Schaumal, ob die Dir 'ne Idee liefern können: www.sqlsnippets.com

Das hatte ich befürchtet. Damit kann ich dann auch jeden Datensatz per Cursor holen und dann in einer Schleife die einzelnen Einträge erstellen.

Danke für den Link! Ich werde mich dort mal umschauen.

NormanNG 16. Okt 2008 13:50

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Hi,

für den MS SQL Server gibt es eine Lösung mit einer "tally table".
Evtl. hilft das auch hier weiter? Link

nahpets 16. Okt 2008 15:24

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Hallo,

einen hab' ich noch, aber bitte dafür nicht hauen:

SQL-Code:
select * from (
select
'SELECT l FROM (SELECT LEVEL l FROM dual '
||'CONNECT BY LEVEL <= ('
||'SELECT spalte_b AS endIndex FROM test WHERE spalte_a = '||spalte_a
||')) WHERE l >= ('
||'SELECT spalte_a AS startIndex FROM test WHERE spalte_a = '||spalte_a ||')'||chr(10)
||'union all' as Spalte
from test
order by spalte_a
)
union all
select 'select 0 from dual' from dual
Man nehme das SQL, führe es aus, nehme das Ergebnis und führe es aus.

Nagut, was passiert hier:
Es wird mit SQL ein SQL-Statement generiert, das für jede Zeile der Tabelle eine Select ... Level ... generiert, die per union all miteinander verbunden werden. Dadurch ist am Ende ein union all zuviel, das mit einem select 0 from dual "neutralisiert" wird.

DeddyH 16. Okt 2008 15:29

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Ach Du Sch**e :shock:. Da würde ich dann doch eher eine SP schreiben.

nahpets 16. Okt 2008 15:46

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Zitat:

Zitat von DeddyH
Ach Du Sch**e :shock:. Da würde ich dann doch eher eine SP schreiben.

naja, wenn man sowas genau einmal braucht, kann man's schon so machen. Aber auch innerhalb von Prozeduren ist das hoch flexibel, wenn man das Ergebnis per Cursor abholt, zu einem String zusammenbaut und den per EXECUTE IMMEDIATE absetzt und dann das Ergebnis abholt. Dadurch muss man zur Entwicklungszeit nicht zwingend wissen, was zur Laufzeit an Daten ansteht.
Selbst das Datenmodell muss zur Entwicklungszeit nicht vollständig bekannt sein, da man die Informationen zum Datenmodell ja letztlich aus der Datenbank holen kann.
Aber: is nix für "ach machen wir das mal so", da muss man vorher schon genau planen, was man will.

NormanNG 16. Okt 2008 15:48

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Hi,

das mit der tally-Tabelle ist deutlich einfacher (zumindest beim SQL-Server).

Einfach (einmalig) eine "Tally"-Tabelle mit einer Spalte "ID" erstellen
und mit den Werte 1...x füllen.

Dann kann man z.B. wie folgt auswerten:

SQL-Code:
select T.ID, A.*
from tally T, tabelleA A
where t.ID between a.Spalte_A und a.Spalte_B

nahpets 16. Okt 2008 15:54

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Zitat:

Zitat von NormanNG
Hi,

das mit der tally-Tabelle ist deutlich einfacher (zumindest beim SQL-Server).

Einfach (einmalig) eine "Tally"-Tabelle mit einer Spalte "ID" erstellen
und mit den Werte 1...x füllen.

Dann kann man z.B. wie folgt auswerten:

SQL-Code:
select T.ID, A.*
from tally T, tabelleA A
where t.ID between a.Spalte_A und a.Spalte_B

Okay, dass heißt aber, dass ich eine Tabelle mit den Werten von n..m zur Verfügung haben muss bzw. sie vorher entsprechen dem kleinsten und größten Wert füllen muss. Geht das auch mit SQL?

PS.: Mein Vorschlag oben ist mehr Spielerei, finde es halt immer wieder verblüffend, was man mit SQL so alles hinbekommt.

NormanNG 16. Okt 2008 15:58

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Zitat:

Zitat von nahpets
Okay, dass heißt aber, dass ich eine Tabelle mit den Werten von n..m zur Verfügung haben muss bzw. sie vorher entsprechen dem kleinsten und größten Wert füllen muss. Geht das auch mit SQL?

Warum denn nicht?

Beispiel aus dem o.g. Link(natürlich SQL-Server :-D )

SQL-Code:
 SELECT TOP 11000 --equates to more than 30 years of dates
        IDENTITY(INT,1,1) AS N
   INTO dbo.Tally
   FROM Master.dbo.SysColumns sc1,
        Master.dbo.SysColumns sc2
Hier wird z.B. ein Kreuzprodukt einer Systemtabelle (enthält alle Spaltennamen der Tabellen in der Master-Datenbank) erstellt, um die tally-Tabelle zu erstellen.

[Edit] Ist vielleicht noch nicht klar geworden: Diese Tabelle wird einmal erstellt und verbleibt in der Datenbank. Dann kann man sie immer wieder auf unterschiedlichste Weise nutzen. vgl. o.g. Link.[/Edit]

nahpets 17. Okt 2008 08:19

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Hallo,

und es geht doch:

Gegeben sei folgende Tabelle:
SQL-Code:
create table tabelle_a_b
(
spalte_a int,
spalte_b int)
mit folgendem Inhalt:
SQL-Code:
insert into tabelle_a_b values(100,110);
insert into tabelle_a_b values(200,220);
insert into tabelle_a_b values(1396000,1396010);
Zuerst ermitteln wir den höchsten Wert aus Tabelle_a_b:
SQL-Code:
select max(greatest(spalte_a,spalte_b)) as Max_Spalte from tabelle_a_b
und erstellen uns nun eine Level-Abfrage aus diesem Ergebnis:
SQL-Code:
SELECT LEVEL l FROM dual CONNECT BY LEVEL < = ( 
  select max(greatest(spalte_a,spalte_b)) as Max_Spalte from tabelle_a_b
)
Nun müssen wir dieses Ergebnis noch mit Tabelle_a_b verbinden:
SQL-Code:
select l from (
SELECT LEVEL l FROM dual CONNECT BY LEVEL < = ( 
  select max(greatest(spalte_a,spalte_b)) as Max_Spalte from tabelle_a_b
)
) Tally, tabelle_a_b
where Tally.L between tabelle_a_b.Spalte_A and tabelle_a_b.Spalte_B
Als Ergebnis bekommen wir:
100
101
102
103
104
105
106
107
108
109
110
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
1396000
1396001
1396002
1396003
1396004
1396005
1396006
1396007
1396008
1396009
1396010

Mit dieser Verfahrensweise benötigen wir keine eigene Tabelle in der Datenbank, bei der wir immer sicherstellen müssen, dass sie auch alle ggfls. erforderlichen Werte enthält.
Hoffe, das Ergebnis entspricht der im ersten Post genannten Fragestellung.

NormanNG 17. Okt 2008 09:44

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Cool :thumb:

Dann hat der Hinweis auf die "tally"-Tabelle letztendlich doch etwas geholfen :wink:

nahpets 17. Okt 2008 09:47

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben
 
Zitat:

Zitat von NormanNG
Cool :thumb:

Dann hat der Hinweis auf die "tally"-Tabelle letztendlich doch etwas geholfen :wink:

Jo, heute morgen beim Rasieren kam der Aha-Effekt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz