AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL Abfrage - sehr langer IN-Wert
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Abfrage - sehr langer IN-Wert

Ein Thema von vsti · begonnen am 16. Jan 2008 · letzter Beitrag vom 16. Jan 2008
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von vsti
vsti

Registriert seit: 20. Sep 2004
Ort: Syke
70 Beiträge
 
Delphi 2005 Architect
 
#1

SQL Abfrage - sehr langer IN-Wert

  Alt 16. Jan 2008, 08:57
Datenbank: Firebird • Version: 1.5 • Zugriff über: dbExpress
Moin moin,

folgende Ausgangssituation:
Es gibt zwei Datenbanken. In der einen liegen die zentralen Kundendaten und in der anderen werden für jede Filiale lokal die Statisikdaten festgehalten.
Wenn ich nun für die Statistik die Kunden nach Kundennummer eingrenzen möche, muss ich das so oder so ähnlich machen:

Delphi-Quellcode:
QueryZentral.sql.text:='select id from kunden where kundennummer between ''001'' and ''101''';
QueryZentral.open;
ids:='';
while not QueryZentral.eof do begin
  ids:=ids+QueryZentral.fieldbyname('id').asstring+',';
  QueryZentral.next;
end;
delete(ids,length(ids),1);

QueryLokal.sql.text:='select sum(umsatz) from stat where kunden_id in ('+ids+')';
QueryLokal.open;
Ja, stimmt, das System ist nicht grade optimal aufgebaut, aber so ist leider mein Ausgangspunkt

Jetzt kann man sich denken wo das Problem liegt... das SQL-Statement kann bei vielen Kunden sehr lang werden.

Heterogene Datenbankverbindungen werden von Firebird/Interbase ja leider nicht unterstützt.

Kann man das Problem anders angehen?

Habs auch mal mit Parametern versucht, à la:

Delphi-Quellcode:
QueryLokal.sql.text:='select sum(umsatz) from stat where kunden_id in (:IDS)';
QueryLokal.parambyname('IDS').asstring:=ids;
QueryLokal.open;
was natürlich nicht geht.

Bin dankbar über Anregungen.
Thorsten
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: SQL Abfrage - sehr langer IN-Wert

  Alt 16. Jan 2008, 09:04
Hallo,

mir schwebt da eher so etwas vor:

SQL-Code:
SELECT SUM(umsatz)
FROM stat
WHERE kunden_id IN (
  SELECT id
  FROM kunden
  WHERE kundennummer BETWEEN :low AND :high
)
Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.559 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: SQL Abfrage - sehr langer IN-Wert

  Alt 16. Jan 2008, 09:06
Die IDs werden ja wahrscheinlich nummerisch sein. Dann würde ich mir mit Format behelfen.
Delphi-Quellcode:
QueryLokal.sql.text := Format('select sum(umsatz) from stat where kunden_id in (%s)',[ids]);
QueryLokal.open;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von vsti
vsti

Registriert seit: 20. Sep 2004
Ort: Syke
70 Beiträge
 
Delphi 2005 Architect
 
#4

Re: SQL Abfrage - sehr langer IN-Wert

  Alt 16. Jan 2008, 09:14
@marabu:
Das würde voraussetzen, dass ich die beiden Datenbanken heterogen verbinden kann, was toll wäre, aber Firebird leider nicht unterstützt.

@DeddyH:
Das würde aufs Selbe hinauslaufen wie mein erster Versuch.

Was ich nicht erwähnt habe, bei vielen Kunden wird das Statement abgeschnitten und dann bekomme ich eine "unexpected end of comment" Servermeldung.
Thorsten
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: SQL Abfrage - sehr langer IN-Wert

  Alt 16. Jan 2008, 09:37
Da stand tatsächlich Datenbanken und nicht Tabellen, sorry.

Durch den (bei allen RDBMs) an mehreren Stellen begrenzten Speicherplatz für ein SQL-Statement kommst du irgendwann nicht um ein Subselect herum. Da Firebird SQL nur mit einer einzigen Datenbank arbeiten kann, musst du zuerst die Tabelle mit den ID-Werten lokal aufbauen oder eine Abstraktionsebene finden, die dir das abnimmt und dich das SQL Statement mit zwei Datenbanken formulieren lässt.

Freundliche Grüße
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: SQL Abfrage - sehr langer IN-Wert

  Alt 16. Jan 2008, 09:43
Ich hatte ein ähnliches Problem (und habs eigentlich auch noch). Bei mir war es allerdings in einer DB, aber dafür ging kein subselect. Also gleich Ausgangssituation (bis auf DB: Oracle) -> viele IDs
Ich würde mich auch für eine andere Lösung interessieren, aber bisher habe ich die IDs geteilt:
SQL-Code:
where ID in (...)
or ID in (...)
or ID in (...)
Ich find es nicht elegant, aber seitdem geht es.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: SQL Abfrage - sehr langer IN-Wert

  Alt 16. Jan 2008, 09:47
Dein Ansatz verhindert lange Literale, aber doch nicht das Verstümmeln des Statements beim Überschreiten der Statement-Puffergröße (meistens 32KB oder 64KB). Oder entgeht mir da etwas?
  Mit Zitat antworten Zitat
Benutzerbild von vsti
vsti

Registriert seit: 20. Sep 2004
Ort: Syke
70 Beiträge
 
Delphi 2005 Architect
 
#8

Re: SQL Abfrage - sehr langer IN-Wert

  Alt 16. Jan 2008, 09:50
Nein, genau das war meine Vermutung. Sprich: temporäre Tabelle lokal befüllen und darauf das Subselect.
Was das wieder dauern wird, 5000 Inserts auszuführen

Ich weiß bescheid, vielen Dank

Edit: man kann über Parameter große Blobs übergeben, daher hatte ich darauf gehofft. Ist das evtl. ein anderer Ansatz?
Thorsten
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: SQL Abfrage - sehr langer IN-Wert

  Alt 16. Jan 2008, 10:17
Zitat von vsti:
Was das wieder dauern wird, 5000 Inserts auszuführen
Wenn Du jeweils mehrere INSERTS in einer Transaktion ausführst, dann sollte das verdammt schnell gehen.

Erstelle Dir eine Stringlist mit allen INSERT-Befehlen und schicke diesen Batch gesammelt zum Server.

PS: Derjenige, der sich in deinem Fall die getrennten Datenbanken ausgedacht hat, sollte geteert und gefedert werden.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.852 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: SQL Abfrage - sehr langer IN-Wert

  Alt 16. Jan 2008, 10:20
Ab FB2.1 gibt es die List-Funktion:
select LIST(id, ',') from kunden where kundennummer between ''001'and ''101'''; Cross-database Query soll ab FB3 (2,5?) kommen.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 19:36 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