AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Join über 3 Tabellen
Thema durchsuchen
Ansicht
Themen-Optionen

Join über 3 Tabellen

Ein Thema von Hansa · begonnen am 3. Mär 2004 · letzter Beitrag vom 6. Mär 2004
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Join über 3 Tabellen

  Alt 5. Mär 2004, 07:25
Hai Hansa,

mal eine ganz andere Frage:

Warum machst Du nicht einfach zwei getrennte Abfragen auf die zwei Tabellen?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
DelphiDeveloper

Registriert seit: 9. Apr 2003
Ort: Köln
256 Beiträge
 
Delphi XE2 Enterprise
 
#12

Re: Join über 3 Tabellen

  Alt 5. Mär 2004, 09:43
das muss doch so gehen!

Code:
SELECT ART.NR,ART.bez, SP.ID, SP.VP
  FROM ART, SP
  WHERE (ART.ID=SP.ID_ART ) AND
        (ID_KUNDE = 661) AND (VP <> 0)
UNION
SELECT ART.NR,ART.bez, ARTPG.ID, ARTPG.PG
  FROM ART, ARTPG
  WHERE (ART.ID=ARTPG.ID_ART) AND
  (ID_KUNDE = 661) AND (VP = 0)
ORDER BY 1
SORRY dein problem mit der ID_KUNDE hatte ich oben überlesen
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#13

Re: Join über 3 Tabellen

  Alt 5. Mär 2004, 10:35
Zitat von Sharky:
Warum machst Du nicht einfach zwei getrennte Abfragen auf die zwei Tabellen?
Zwei Alternativen gibt es schon:

1. ich mache ein zweites Select, sobald ich auf einen Preis = 0 stoße (heißt: KEIN Sonderpreis, Standardpreis aus Preisgruppen-Table).Mache ich so im Moment. Dauert aber unnötig lange, wegen dauerndem öffnen und schließen des Preisgruppen-Dataset.

2. Probiere ich gleich mal aus: ich lese ALLE Sätze der Preisgruppe. Dann hätte ich die 2 Datasets immer geöffnet. Ist aber auch nicht schön und auch wohl lahm. Man stelle sich einmal einen Kunden vor, der 5 Preise hat (3 Sonderpreise, 2 normale). Die Sonderpreise hätte ich sofort und für die beiden anderen muß ich jeweils mehrere 1000 Preisgruppen durchwühlen.

Zudem bin mir ziemlich sicher, daß das auch besser geht.
Gruß
Hansa
  Mit Zitat antworten Zitat
DelphiDeveloper

Registriert seit: 9. Apr 2003
Ort: Köln
256 Beiträge
 
Delphi XE2 Enterprise
 
#14

Re: Join über 3 Tabellen

  Alt 5. Mär 2004, 10:38
ich habe mal eine stored proc auf interbase gemacht, mit der muesste es aber
jetzt gehen

Code:

CREATE PROCEDURE GET_ARTIKEL (
    IN_ID_KUNDE INTEGER)
RETURNS (
    OUT_NR INTEGER,
    OUT_BEZ VARCHAR(30),
    OUT_ID INTEGER,
    OUT_PREIS NUMERIC(9,2))
AS
/* HILFSVARIABLEN FUER ERSTE ABFRAGE */
DECLARE VARIABLE OUT_HNR INTEGER;
DECLARE VARIABLE OUT_HBEZ VARCHAR(30);
DECLARE VARIABLE OUT_HID INTEGER;
DECLARE VARIABLE OUT_HPREIS NUMERIC(9,2);
BEGIN
 FOR SELECT ART.NR,ART.BEZ, SP.ID, SP.VP
      FROM ART , SP
      WHERE (ART.ID=SP.ID_ART ) AND
             SP.ID_KUNDE = :IN_ID_KUNDE
      INTO :OUT_HNR, :OUT_HBEZ, :OUT_HID, :OUT_HPREIS
 DO
  /* ist der preis <> 0 dann gebe hilfsvariablen aus */
  IF (OUT_HPREIS <> 0) THEN
  BEGIN
    OUT_NR = :OUT_HNR;
    OUT_BEZ = :OUT_HBEZ;
    OUT_ID = :OUT_HID;
    OUT_PREIS = :OUT_HPREIS;
    SUSPEND;
  END
  ELSE
  BEGIN
    /* preis offensichtlich 0 -> hole preis von artpg direkt in ausgabevariable */
    FOR SELECT ART.NR,ART.BEZ, ARTPG.ID, ARTPG.PG
    FROM ART, ARTPG
    WHERE (ART.ID = ARTPG.ID_ART) AND ART.NR = :OUT_HNR /* das ist die art.nr bon oben */
    INTO :OUT_NR, :OUT_BEZ, :OUT_ID, :OUT_PREIS
   DO
    SUSPEND;
  END


END
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#15

Re: Join über 3 Tabellen

  Alt 5. Mär 2004, 11:17
Dein Problem bestand darin, dass du in der 2. Abfrage auch die Artikel bekommst, die im ersten schon vorkommen.
SQL-Code:
SELECT Art.Nr
      ,Art.Bez
      ,Sp.Id
      ,Sp.Vp
FROM Art INNER JOIN Sp ON Art.Id = Sp.ID_Art
WHERE Id_Kunde = :i_ID_Kunde And Vp <> 0
UNION
SELECT Art.Nr
      ,Art.Bez
      ,ArtPG.ID
      ,ArtPG.PG
FROM Art INNER JOIN ArtPG ON Art.ID = ArtPG.ID_Art
WHERE Art.ID Not In (SELECT subSP.ID_Art
                      FROM Sp subSP
                      WHERE subSP.ID_Kunde = :i_ID_Kunde)
Zitat von Hansa:
...Ist aber auch nicht schön und auch wohl lahm. ...
Wenn du die Kunden ID als Parameter übergibst und einen Index auf ID_Art legst, dürfte das da oben ziemlich flink sein.
Beim ersten Ausführen normal schnell, danach kann der Server auf Werte aus dem Cache zurückgreifen (dank der Verwendung des Parameters) -> viel schneller (abhängig von Größe & Typ vom Arbeitsspeicher des Servers).
Der Index auf Art_ID soll im "NOT IN..."-sub select aus einem Table scan in einen Index scan machen -> nochmal schneller.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#16

Re: Join über 3 Tabellen

  Alt 5. Mär 2004, 13:53
Hi,

der Tip von DelphiDeveloper läuft schon. Allerdings bringt es nicht so viel wie erwartet. Das Schließen und Öffnen einzelner Datensätze scheint nicht so viel langsamer zu sein. Statt 20 Sek. dauert es immer noch 10. Oder ist das normal bei 500 Records ?

Das Beispiel von Robert_G läuft anscheinend in eine Endlosschleife. Allerdings weiß ich nicht genau, was das letzte Select mit dem subSP genau machen soll. Werden etwa nicht vorhandene IDs gesucht ? Wenn jemand 100 Preise, davon 50 Sonderpreise hat, so sind die anderen 50 schon da. Das Kennzeichen ist SP=0.
Gruß
Hansa
  Mit Zitat antworten Zitat
DelphiDeveloper

Registriert seit: 9. Apr 2003
Ort: Köln
256 Beiträge
 
Delphi XE2 Enterprise
 
#17

Re: Join über 3 Tabellen

  Alt 5. Mär 2004, 14:01
Zitat:
Das Schließen und Öffnen einzelner Datensätze scheint nicht so viel langsamer zu sein. Statt 20 Sek. dauert es immer noch 10. Oder ist das normal bei 500 Records ?
Das muss aber bei 500 rec viel schneller laufen! Hast du es mit meiner SP gemacht?
Wenn ja lass mal sehen wie sie jetzt aussieht
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#18

Re: Join über 3 Tabellen

  Alt 5. Mär 2004, 20:25
so siehts aus:

SQL-Code:
BEGIN
 FOR SELECT ART.ID, ART.NR,ART.BEZ, SP.VP
      FROM ART, SP
      WHERE (ART.ID=SP.ID_ART ) AND
             SP.ID_KUNDE = :ID_KUNDE
      INTO :OUT_HARTID, :OUT_HNR, :OUT_HBEZ, :OUT_HPREIS
 DO
begin
  OUT_NR = :OUT_HNR;
  OUT_BEZ = :OUT_HBEZ;
  OUT_PREIS = :OUT_HPREIS;
  /* ist der preis <> 0 dann gebe hilfsvariablen aus */
  IF (OUT_HPREIS <> 0) THEN BEGIN
    SUSPEND;
  END
  ELSE
  BEGIN
    /* preis = 0 -> hole preis von artpg direkt in ausgabevariable */
    FOR SELECT ARTPG.PG FROM ARTPG
    WHERE (ARTPG.ID_ART = :OUT_HARTID) AND (ARTPG
.PGNR = :PGNR) /* das ist die art.nr von oben */
    INTO :OUT_PREIS
   DO
    SUSPEND;
  END
end
END
Ich habe nicht viel gemacht.
Gruß
Hansa
  Mit Zitat antworten Zitat
DelphiDeveloper

Registriert seit: 9. Apr 2003
Ort: Köln
256 Beiträge
 
Delphi XE2 Enterprise
 
#19

Re: Join über 3 Tabellen

  Alt 6. Mär 2004, 12:20
ist das antwort-zeitverhalten im ibexpert den schneller oder dauert
es genauso lange wie in deine App?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:50 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