Delphi-PRAXiS
Seite 2 von 2     12   

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)

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 08:44 Uhr.
Seite 2 von 2     12   

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