AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Alle Werte zwischen zwei ZAhlen mit SQL ausgeben

Alle Werte zwischen zwei ZAhlen mit SQL ausgeben

Ein Thema von barnti · begonnen am 16. Okt 2008 · letzter Beitrag vom 17. Okt 2008
Antwort Antwort
Seite 2 von 2     12
nahpets
(Gast)

n/a Beiträge
 
#11

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben

  Alt 16. Okt 2008, 16:46
Zitat von DeddyH:
Ach Du Sch**e . 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.
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#12

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben

  Alt 16. Okt 2008, 16:48
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
Gruß
Norman
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#13

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben

  Alt 16. Okt 2008, 16:54
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.
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#14

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben

  Alt 16. Okt 2008, 16:58
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 )

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]
Gruß
Norman
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#15

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben

  Alt 17. Okt 2008, 09:19
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:
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.
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#16

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben

  Alt 17. Okt 2008, 10:44
Cool

Dann hat der Hinweis auf die "tally"-Tabelle letztendlich doch etwas geholfen
Gruß
Norman
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#17

Re: Alle Werte zwischen zwei ZAhlen mit SQL ausgeben

  Alt 17. Okt 2008, 10:47
Zitat von NormanNG:
Cool

Dann hat der Hinweis auf die "tally"-Tabelle letztendlich doch etwas geholfen
Jo, heute morgen beim Rasieren kam der Aha-Effekt.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:42 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