AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken C# SELECT JOIN MIN richtig kombinieren?
Thema durchsuchen
Ansicht
Themen-Optionen

SELECT JOIN MIN richtig kombinieren?

Ein Thema von Jürgen Thomas · begonnen am 16. Nov 2007 · letzter Beitrag vom 17. Nov 2007
Antwort Antwort
Seite 1 von 2  1 2      
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#1

SELECT JOIN MIN richtig kombinieren?

  Alt 16. Nov 2007, 14:09
Datenbank: Firebird • Version: 2.0 • Zugriff über: Firebird Net Provider
Hallo,

mit meinen vielen vergeblichen Versuchen komme ich immer stärker durcheinander und bitte deshalb um Hilfe.
  • Tabelle ORTE2 enthält u.a. die Felder Ort-ID (= Alort) und Name (95.000 Datensätze).
  • Tabelle PLZ enthält u.a. die Felder PLZ, Ort-ID, PLZ-Art, Str-Verz (40.000 Datensätze).
  • Über Ort-ID ist kein ForeignKey möglich, weil es sich nicht um die eigentliche ORTE-Tabelle handelt, sondern um eine Tabelle mit nicht mehr gültigen Ortsnamen; aber Ort-ID soll als Verknüpfung dienen. Es bestehen folgende Verbindungen:
    1. Zu einem Eintrag aus ORTE2 gibt es 0 Einträge in PLZ.
    2. Zu einem Eintrag aus ORTE2 gibt es 1 Eintrag in PLZ.
    3. Zu einem Eintrag aus ORTE2 gibt es mehrere Einträge in PLZ.
Per View möchte ich eine Liste als Verbindung zwischen ORTE2 und PLZ haben: Wenn in PLZ kein Eintrag vorhanden ist, dann fehlt dieser Ort; bei einem Eintrag soll genau dieser für den JOIN verwendet werden; bei mehreren Einträgen soll derjenige mit der kleinsten PLZ (und nur dieser) verwendet werden.

Ziel soll etwas wie folgt werden:
SQL-Code:
SELECT ORTE2.Name, ORTE2.Alort,
       PLZ.PLZ,
       PLZ.Plz_Art,
       PLZ.Str-Verz
  FROM ORTE2
  JOIN PLZ ON PLZ.Alort = ORTE2.Alort
Es gelingt mir aber nicht, die JOIN-Klausel so zu erweitern oder ein SubSelect so einzubauen, dass MIN(PLZ) (oder FIRST 1) berücksichtigt wird.

Ergänzend muss ich darauf hinweisen, dass Firebird Probleme hat mit verschachtelten SubSelects oder IN-Prüfungen bei WHERE-Klauseln und sich gerne aufhängt. Nach Erledigung dieses Problems kommen noch ein weiterer JOIN und eine WHERE-Klausel hinzu; aber die sind unproblematisch.

Könnt Ihr mir einen Weg nennen? Danke! Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
marabu

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

Re: SELECT JOIN MIN richtig kombinieren?

  Alt 16. Nov 2007, 14:46
Hallo Jürgen,

ich denke, dass du einfach ein MIN(PLZ.PLZ) mit in die Selektion aufnehmen und die passende GROUP BY Klausel ergänzen musst.

Grüße vom marabu
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#3

Re: SELECT JOIN MIN richtig kombinieren?

  Alt 16. Nov 2007, 15:24
Das hatte ich auch gehofft:
SQL-Code:
SELECT ORTE2.Name, ORTE2.Alort,
       MIN(PLZ.PLZ),
       PLZ.Plz_Art,
       PLZ.Str-Verz
  FROM ORTE2
  JOIN PLZ ON PLZ.Alort = ORTE2.Alort
  GROUP BY PLZ.PLZ
Das liefert (getestet im SQL-Fenster von IBExpert):
Zitat:
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).
Ich gebe zu, dass ich mit MIN und GROUP BY/ORDER BY noch zu wenig Ahnung habe und deshalb völlig unsicher bin, was ich der GroupBy-Klausel hinzufügen muss. Eigentlich muss es doch darum gehen, das JOIN einzuschränken, oder?

Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

Re: SELECT JOIN MIN richtig kombinieren?

  Alt 16. Nov 2007, 15:26
Wenn Du Aggregatfunktionen (hier MIN) verwendest, musst Du nach allen Nicht-Aggregatfeldern gruppieren.
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
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#5

Re: SELECT JOIN MIN richtig kombinieren?

  Alt 16. Nov 2007, 15:44
Zitat von DeddyH:
Wenn Du Aggregatfunktionen (hier MIN) verwendest, musst Du nach allen Nicht-Aggregatfeldern gruppieren.
Das hatte ich schon gelesen, aber nicht ausprobiert: Zum einen soll meine "echte" View 14 Felder liefern, und Gruppierung über 14 Felder ist doch ziemlich aufwändig. Zum anderen liefert das aber wirklich ein falsches Ergebnis:
SQL-Code:
SELECT ORTE2.Name, ORTE2.Alort,
       MIN(PLZ.PLZ),
       PLZ.Plz_Art,
       PLZ.Str-Verz
  FROM ORTE2
  JOIN PLZ ON PLZ.Alort = ORTE2.Alort
  GROUP BY PLZ.PLZ,
       /* ergänzt um: */
       ORTE2.Name, ORTE2.Alort, PLZ.Plz_Art, PLZ.Str-Verz
Zuerst wird offensichtlich das JOIN ausgeführt, und das führt zu doppelten Einträgen (alle PLZ zur gleichen Ort-ID/Alort). Erst danach kommt die Gruppierung mit MIN, und das hat natürlich keine "echten" Auswirkungen mehr.

Nochmal: Beim JOIN will ich nur einen Eintrag aus PLZ holen, nämlich die kleinste PLZ.

Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

Re: SELECT JOIN MIN richtig kombinieren?

  Alt 16. Nov 2007, 15:51
Nimm das PLZ.PLZ mal aus der Gruppierung heraus, das macht an der Stelle keinen Sinn.
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
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#7

Re: SELECT JOIN MIN richtig kombinieren?

  Alt 16. Nov 2007, 15:59
Zitat von DeddyH:
Nimm das PLZ.PLZ mal aus der Gruppierung heraus, das macht an der Stelle keinen Sinn.
Stimmt, aber das ändert an meinem Hauptproblem nichts. Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

Re: SELECT JOIN MIN richtig kombinieren?

  Alt 16. Nov 2007, 16:02
Schau Dir mal dies hier an.
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
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#9

Re: SELECT JOIN MIN richtig kombinieren?

  Alt 16. Nov 2007, 19:23
Danke, DeddyH, das war ein sehr hilfreicher Hinweis.

Ich habe das erst einmal so eingebaut:
SQL-Code:
SELECT ORTE2.Name, ORTE2.Alort,
       p1.PLZ,
       p1.Plz_Art,
       p1.Str-Verz
  FROM ORTE2, PLZ p1
  WHERE (p1.Alort = ORTE2.Alort)
    AND (p1.Plz = (SELECT MIN(PLZ) FROM PLZ p2 WHERE p2.Alort = p1.Alort))
Das Ergebnis sieht recht gut aus, aber so stimmt es vermutlich noch nicht: Im Ergebnis erhalte ich nur 41.000 Datensätze, aber nach meiner Schätzung dürfte von den 95.000 Einträgen in ORTE2 nur ein kleiner Teil herausfallen. Das werde ich morgen weiter untersuchen und mich dann wieder melden.

Danach muss die Abfrage noch optimiert werden (ist nicht auch dabei ein JOIN möglich?), auch wegen der Feststellungen des Analyse-Plans.

Schönes Wochenende erstmal! Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: SELECT JOIN MIN richtig kombinieren?

  Alt 16. Nov 2007, 20:28
Hallo Jürgen,

ich versuche mich jetzt auch mal dran...

SQL-Code:
SELECT o.name, o.alort,
       p.plz, p.plz_art, p.str_verz
FROM orte2 o
INNER JOIN (SELECT alort, plz_art, str_verz, MIN(plz) plz
            FROM plz
            GROUP BY alort, plz_art, str_verz) p
  ON o.alort = p.alort
Da du leider nichts über die beiden Spalten (plz_art und str_verz) verraten hast, ist diese Abfrage vielleicht problematisch und fehlerhaft.

Deshalb gleich noch ein Versuch, der diese Problematik umgeht...
SQL-Code:
SELECT o.name, o.alort,
       p.plz, p.plz_art, p.str_verz
FROM orte2 o
INNER JOIN (SELECT alort, plz_art, str_verz, plz
            FROM plz p
            WHERE plz = (SELECT MIN(plz)
                         FROM plz
                         WHERE alort = p.alort)) p
  ON o.alort = p.alort
Gruss
Thorsten
  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 04:01 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