Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Join innerhalb einer Tabelle (https://www.delphipraxis.net/138768-join-innerhalb-einer-tabelle.html)

DoktorD 17. Aug 2009 11:36

Datenbank: MS SQL • Version: 2000 • Zugriff über: ADO Connection

Join innerhalb einer Tabelle
 
Servus. Bin noch ein blutiger SQL Anfänger und stoße mittlerweile so an meine Grenzen. Und zwar versuche ich ein InnerJoin innerhalb einer Tabelle zu machen. Bin so vorgegangen wie bei 2 unterschiedlichen Tabelle, aber das funktioniert nicht

Ich habe eine Tabelle mit Messwerten. Die Messwerte sind alle einer PrüfID zugeordnet. Es können mehrere Messwerte zu einer PrüfID existieren.
Ich will nun anhand der Toleranzen (+/- 0,03) eines Messwertes die IDs filtern, die dafür zutreffen. Von diesen übrig gebliebenen IDs will ich dann einen anderen Messwert auslesen und davon dem Mittelwert bilden.

Hier mal ein Bisschen Code (in 2 unterschiedliche Abfragen unterteilt):
SQL-Code:
SELECT dbo.V_JUMO_MEASURE.PRUEFID FROM dbo.V_JUMO_MEASURE
where dbo.V_JUMO_MEASURE.AUFTRAG = '1323259-01' AND
      dbo.V_JUMO_MEASURE.MW_NAME = 'Temperatur T1 korrigiert' AND
     (dbo.V_JUMO_MEASURE.IST_WERT >= (dbo.V_JUMO_MEASURE.SOLL_WERT - 0.033)) AND
     (dbo.V_JUMO_MEASURE.IST_WERT <= (dbo.V_JUMO_MEASURE.SOLL_WERT + 0.033))

SELECT dbo.V_JUMO_MEASURE.PRUEFID, dbo.V_JUMO_MEASURE.IST_WERT FROM dbo.V_JUMO_MEASURE
where dbo.V_JUMO_MEASURE.AUFTRAG = '1323259-01' AND
      dbo.V_JUMO_MEASURE.MW_NAME = 'Widerstand T1 korrigiert'
Kann mir jemand von Euch weiterhelfen? Vielen Dank im Voraus!!!

mkinzler 17. Aug 2009 11:55

Re: Join innerhalb einer Tabelle
 
Bei Selfjoins benötigst du 2 "Instanzen" einer Tabelle, was du durch Angebae eines Alias erzwingen kannst

SQL-Code:
from
    <Tabelle> t1 join <Tabelle> t2 on t2. ...

DeddyH 17. Aug 2009 11:57

Re: Join innerhalb einer Tabelle
 
Ich weiß nicht, ob ich Dich richtig verstanden habe, aber vielleicht so?
SQL-Code:
SELECT dbo.V_JUMO_MEASURE.PRUEFID, AVG(dbo.V_JUMO_MEASURE.IST_WERT) FROM dbo.V_JUMO_MEASURE
where dbo.V_JUMO_MEASURE.AUFTRAG = '1323259-01' AND
      dbo.V_JUMO_MEASURE.MW_NAME = 'Widerstand T1 korrigiert' AND dbo.V_JUMO_MEASURE.PRUEFID IN
      (SELECT dbo.V_JUMO_MEASURE.PRUEFID FROM dbo.V_JUMO_MEASURE
       where dbo.V_JUMO_MEASURE.AUFTRAG = '1323259-01' AND
             dbo.V_JUMO_MEASURE.MW_NAME = 'Temperatur T1 korrigiert' AND
             dbo.V_JUMO_MEASURE.IST_WERT BETWEEN (dbo.V_JUMO_MEASURE.SOLL_WERT - 0.033) AND
             (dbo.V_JUMO_MEASURE.SOLL_WERT + 0.033))
GROUP BY dbo.V_JUMO_MEASURE.PRUEFID

Jürgen Thomas 17. Aug 2009 12:02

Re: Join innerhalb einer Tabelle
 
Hallo,

wenn ich deine Frage richtig verstehe, ist die Lösung nicht ein JOIN auf die Tabelle selbst, sondern eher eine Unterabfrage:
Zitat:

Ich will nun anhand der Toleranzen (+/- 0,03) eines Messwertes die IDs filtern, die dafür zutreffen.
Das hast du doch mit dem ersten SELECT-Befehl erreicht.
Zitat:

Von diesen übrig gebliebenen IDs will ich dann einen anderen Messwert auslesen und davon dem Mittelwert bilden.
Also brauchst du als Hauptfrage so etwas:
SQL-Code:
SELECT andererMesswert FROM dbo.V_JUMO_MEASURE
 WHERE PruefID IN ( erster Select );
Und da muss dann noch der Mittelwert eingebaut werden.

Ich hoffe, ich konnte helfen. Jürgen

//Detlef war schneller.

DoktorD 17. Aug 2009 12:11

Re: Join innerhalb einer Tabelle
 
Stimmt, mit

SQL-Code:
SELECT AVG(dbo.V_JUMO_MEASURE.IST_WERT)
FROM dbo.V_JUMO_MEASURE
WHERE dbo.V_JUMO_MEASURE.PRUEFID IN
(
SELECT dbo.V_JUMO_MEASURE.PRUEFID FROM dbo.V_JUMO_MEASURE
where dbo.V_JUMO_MEASURE.AUFTRAG = '1291626-92' AND
      dbo.V_JUMO_MEASURE.MW_NAME = 'Temperatur T1 korrigiert' AND
     (dbo.V_JUMO_MEASURE.IST_WERT >= (dbo.V_JUMO_MEASURE.SOLL_WERT - 0.05)) AND
     (dbo.V_JUMO_MEASURE.IST_WERT <= (dbo.V_JUMO_MEASURE.SOLL_WERT + 0.05))
) AND dbo.V_JUMO_MEASURE.MW_NAME = 'Widerstand T1 korrigiert'
funktioniert es.

Aber die Idee von mkienzler ist auch nicht schlecht. Wie kann ich denn einen Alias für eine komplette Tabelle vergeben?
Welche Abfrage müsste denn theoretisch schneller sein?

Vielen Dank

DeddyH 17. Aug 2009 12:14

Re: Join innerhalb einer Tabelle
 
Einen SELF JOIN hatten wir eben erst: http://www.delphipraxis.net/internal...t.php?t=163197

Jürgen Thomas 17. Aug 2009 12:17

Re: Join innerhalb einer Tabelle
 
Zitat:

Zitat von DoktorD
Wie kann ich denn einen Alias für eine komplette Tabelle vergeben?

Ein Alias hat nichts mit JOIN oder Unterabfrage oder sonst etwas zu tun; es ist lediglich etwas für Schreibfaule (also für alle Programmierer). Statt überall "dbo.V_JUMO_MEASURE" zu schreiben, kannst du einfach ein Kürzel verwenden; das ist vor allem bei JOINs, also gleichzeitigem Zugriff auf mehrere Tabellen (oder dieselbe Tabelle mehrfach) nützlich.
SQL-Code:
SELECT AVG(meas.IST_WERT)
FROM dbo.V_JUMO_MEASURE meas
WHERE meas.PRUEFID IN ( ... )
Eine Minimalversion für SELF JOIN haben wir gerade unter self join beispiel konstruieren besprochen.

Jürgen

/Detlef war wieder schneller; und der rote Kasten fehlte.

mkinzler 17. Aug 2009 12:22

Re: Join innerhalb einer Tabelle
 
Zitat:

Ein Alias hat nichts mit JOIN oder Unterabfrage oder sonst etwas zu tun; es ist lediglich etwas für Schreibfaule (also für alle Programmierer). Statt überall "dbo.V_JUMO_MEASURE" zu schreiben, kannst du einfach ein Kürzel verwenden;
Jein, bei Self Joins sind sie essentiell, um die verschiedenen "Instanzen" zu erzwingen/unterscheiden

DoktorD 17. Aug 2009 12:27

Re: Join innerhalb einer Tabelle
 
Vielen Dank für die Tipps. Damit kann ich auf jeden Fall was anfangen ;-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz