SQL mit Unterabfrage in gleicher Tabelle

Mitglied: GBN-WS2
Folgender Fall liegt vor. Es gibt eine Tabelle mit den Spalten:
- Auftrag
- Kürzel
- Licht
- Farbe
- Status.

In die Tabelle kommen jetzt Werte, die Messungen betreffen. Teile werden vor Bearbeitung gemessen und danach. Beide Messungen kommen in eine Tabell. Das heißt, es gibt für das gleiche Teil (über Auftrag und Kürzel eindeutig identifizierbar) jeweils 2 Einträge in der Tabelle. Diese werden über den Status gekennzeichnet (1 für vorher und 2 für nachher).
Für die Begutachtung der Bearbeitung sollen die 2 über Auftrag und Kürzel zusammengehörenden Datensätze in einer neuen Tabelle dargestellt werden. Dazu versuche ich im SQL Server Management Studio eine User Definde Function zu erstellen, denen ich die Parameter für den Auftrag und das Kürzel übergebe und die dann eine Tabelle zurückgibt. Leider führt bei mir dem Umweg über die UDF, weil ich den Fall nicht mit einem SQL Statement hinbekommen habe. Die Unterabfragen auf den 2. dazugehörigen Datensatz kontte ich nicht zusammenbasteln, da die Übergabeparameter für die WHERE-Klausel sich nicht auf den Datensatz der Abfrage beziehen konnten.

Beispiel Tabelle jetzt:
1000; A; 11; 2;1 (für vor der Bearbeitung)
1000; A; 9; 3; 2 (nach der Bearbeitung)

Inhalt der der gewünschen Zieltabelle sollte sein:
1000; A; 11; 2; 9; 3
Vielleich noch eine Spalte am Ende für den Anteil vom Licht vor und nach der Bearbeitung (9 zu 11 = 81,8%)

Derzeit bin ich so weit, dass die UDF wie folgt aussieht:

CREATE FUNCTION [dbo].[fnLichtwerte_Klar_B0] (@BID Int, @SANr Int, @EANr Int)
RETURNS @tblLichtwerte TABLE
(Auftrag char(24),
Kuerzel char(1),
Datum_K smalldatetime,
P_K real,
L_K real,
x_K real,
y_K real,
Datum_B smalldatetime,
P_B real,
L_B real,
x_B real,
y_B real,
Absorption real)
AS
BEGIN
DECLARE @Auftrag char(24)
DECLARE @Datum_K datetime2, @Datum_B datetime
DECLARE @P_K real, @L_K real, @x_K real, @y_K real
DECLARE @P_B real, @L_B real, @x_B real, @y_B real
DECLARE @KB int, @Kuerzel char(1), @B_ID int, @verw int
DECLARE @Absorption real



DECLARE Messwerte_Klar CURSOR LOCAL STATIC

-- Schleife durch die Klarmessungen
FOR
SELECT Auftrag.Produktion_Vorgangsnummer,
Messwerte.Produktion_Kuerzel,
Messung.Produktion_Datum,
Messwerte.Produktion_Leistung,
Messwerte.Produktion_Korr_Lichtstrom,
Messwerte.Produktion_Korr_Farbort_X,
Messwerte.Produktion_Korr_Farbort_Y,
'1900-01-01', 0, 0, 0, 0, 0
FROM dbo.tblProduktion_BrennerMessung AS Messwerte
INNER JOIN dbo.tblProduktion_Messung AS Messung ON Messwerte.Produktion_Verweis_Messung_ID = Messung.Produktion_Messung_ID
INNER JOIN dbo.tblProduktion_Messauftrag AS Auftrag ON Messung.Produktion_Verweis_Messauftrag_ID = Auftrag.Produktion_Messauftrag_ID
WHERE (Auftrag.Produktion_Verweis_Brennertyp_ID = @BID) AND Messwerte.Produktion_MessungVerworfen = 0 AND Messung.Produktion_Messungstyp_Klar_Beschichtet = 1 AND (Auftrag.Produktion_Vorgangsnummer BETWEEN @SANr AND @EANr);

OPEN Messwerte_Klar

FETCH NEXT FROM Messwerte_Klar INTO @Auftrag, @Kuerzel, @Datum_K, @P_K, @L_K, @x_K, @y_K, @Datum_B, @P_B, @L_B, @x_B, @y_B, @Absorption

WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN
INSERT INTO @tblLichtwerte
VALUES (@Auftrag, @Kuerzel, @Datum_K, @P_K, @L_K, @x_K, @y_K, @Datum_B, @P_B, @L_B, @x_B, @y_B, @Absorption);
END
FETCH NEXT FROM Messwerte_Klar INTO @Auftrag, @Kuerzel, @Datum_K, @P_K, @L_K, @x_K, @y_K, @Datum_B, @P_B, @L_B, @x_B, @y_B, @Absorption
END

CLOSE Messwerte_Klar
DEALLOCATE Messwerte_Klar
RETURN
END

Leider kenne ich den Weg nicht, wie ich die Nullen für den Nachbearbeitungszustand durch Unterabfragen ersetzen kann.
DIE UDF wäre nur meine 2t-liebste Lösung. Am besten wäre es mit einem SQL-Statement.

Bin gespannt, ob mir jemand helfen kann.

Danke

Content-Key: 667470

Url: https://administrator.de/contentid/667470

Ausgedruckt am: 20.06.2021 um 03:06 Uhr

13 Kommentare
Mitglied: GBN-WS2
Es muss "SQL mit Unterabfrage" heißen
Mitglied: ukulele-7
Klingt für mich nach viel zu kompliziert gedacht. Ist doch einfach ein Join in einem Select (den man dann auch als View verfügbar machen kann), in etwa so:

PS: Ich gehe davon aus das sichergestellt ist, das Auftrag + Kürzel immer eindeutig ist und es immer mind. 1x Status = 1 gibt und 0 bis 1 mal Status 2.
Mitglied: GBN-WS2
Interessanter Ansatz. Leider sind mit nur die Inner Joins so richtig bekannt. Ich probieren das mal mit dem Left Join. Danke vorerst.
Mitglied: GBN-WS2
Hab etwas genauer hingesehen. Die Daten über den Status sowie andere Informationen kommen aus insgesamt 3 Tabellen, die jetzt schon innergejoint sind:
SELECT Auftrag.Produktion_Vorgangsnummer,
Messwerte.Produktion_Kuerzel,
Messung.Produktion_Datum,
Messwerte.Produktion_Leistung,
Messwerte.Produktion_Korr_Lichtstrom,
Messwerte.Produktion_Korr_Farbort_X,
Messwerte.Produktion_Korr_Farbort_Y,
'1900-01-01', 0, 0, 0, 0, 0
FROM dbo.tblProduktion_BrennerMessung AS Messwerte
INNER JOIN dbo.tblProduktion_Messung AS Messung ON Messwerte.Produktion_Verweis_Messung_ID = Messung.Produktion_Messung_ID
INNER JOIN dbo.tblProduktion_Messauftrag AS Auftrag ON Messung.Produktion_Verweis_Messauftrag_ID = Auftrag.Produktion_Messauftrag_ID
WHERE (Auftrag.Produktion_Verweis_Brennertyp_ID = @BID) AND Messwerte.Produktion_MessungVerworfen = 0 AND Messung.Produktion_Messungstyp_Klar_Beschichtet = 1 AND (Auftrag.Produktion_Vorgangsnummer BETWEEN @SANr AND @EANr);

Wie kann ich hier zusätzlich den LEFT JOIN mitverwenden?
Mitglied: em-pie
Moin,

eine Bitte: verwende unbedingt die code-Tags (Ohne die Leerzeichen): < code > MEIN CODE < /code >
Die kannst du auch nachträglich noch in deine Posts einbinden.

Ein LEFT JOIN (oder auch Right oder Outer Join) nutzt man exakt wie ein INNER JOIN, nur das Ergebnis ist jedes mal "anders".

Hier ist das ganz gut erklärt, insbesondere auch durch die Grafik:
https://stackoverflow.com/questions/406294/left-join-vs-left-outer-join- ...

Gruß
em-pie
Mitglied: ukulele-7
Lösung ukulele-7 aktualisiert vor 9 Tagen
LEFT JOIN ist genauso wie der INNER JOIN absolute Basisfunktionalität. Dabei enthält das Ergebnis auch Datensätze der ersten Tabelle (die im FROM-Teil) zu denen keine passenden Datensätze in der 2ten Tabelle gefunden wurden. Das dürfte in deinem Fall vor kommen wenn Messung 1 statt gefunden hat aber Messung 2 noch aus steht.

Was die "Ursprungstabelle" angeht: Man macht es sich gern einfach und in deinem Szenario wäre das wohl auch übersichtlicher. Daher fasse ich dein Query gar nicht an sondern packe das entweder in eine vorgelagerte View oder in eine WITH-clause. Der Vorteil ist dabei ganz klar das man gar nicht das Query verstehen muss um es mit sich selbst zu joinen sondern als eine Ausgangstabelle behandelt. Nachteil ist wohl das es anders theoretisch performanter sein kann.
Deine Eingangs erwähnte Spalte Status findet sich allerdings noch nicht in deinem Ausgangsselect wieder. Das * sollte dann auch durch explizite Spaltennamen ersetzt werden.
Mitglied: GBN-WS2
Danke bis hier her. Ich hab das Status-Feld noch eingebaut und etwas aufgeräumt. Die Abfrage geht ohne Fehlermeldung und liefert Daten. Jetzt muss ich nur noch sehen, dass ich das Ganze in eine UDF auf dem SQL-SERVER hinterlegt bekomme, die eine Tabelle ausgibt und der ich die Parameter BID, SANr und SENr übergeben kann.
Mitglied: ukulele-7
Wie wäre es mit einer View anstelle einer UDF? https://www.w3schools.com/SQL/sql_view.asp
Mitglied: GBN-WS2
Ich denke, an eine View kann man keine Parameter übergeben. Ich muss aber die BID, SANr und SENr dynamisch aus einem Frontend-Formular auslesen und übergeben.
Mitglied: ukulele-7
Die View fragst du mit einem Select ab, der Select beinhaltet im WHERE-Teil die Parameter...
Mitglied: GrueneSosseMitSpeck
auch wenns nach schwarzer Magie klingt - schreib das als verschachtelte Select Statements hin, alle gängigen SQL Server optimieren das später so daß ein Join im Abfrageplan auftaucht. Weil ansosnten die clientseitig definierten Joins per SQL tlw die serverseitige Optimierung (speziell beim MS SQL Server) manchmal in die Irre treibt und der dann extrem lange für triviale Abfragen braucht.
Mitglied: GBN-WS2


Mitglied: em-pie
Nutze, wie oben schon geschrieben, doch bitte die Code-Tags.
Das kann hier doch keiner ordentlich lesen!
Heiß diskutierte Beiträge
Windows 10
Austritt Mitarbeiter - Windows- u. M365 Konto
gelöst NixVerstehenVor 1 TagFrageWindows 1011 Kommentare

Moin zusammen, ich habe hier im Kleinunternehmen tatsächlich zum ersten Mal die Situation, das eine Mitarbeiterin aus dem kaufmännischen Bereich ausscheiden wird. Die Kollegin ist ...

Netzwerke
Kassen freezen ohne ersichtlichen Grund
Ronic1Vor 18 StundenFrageNetzwerke12 Kommentare

Hallo Zusammen, ich schreibe heute zum ersten Mal in diesem Forum. Also weißt mich bitte auf etwaige Fehler meinerseits hin. Wie ich in anderen Beiträgen ...

Windows Server
Always-on-VPN mit einer Netzwerkkarte
bluelightVor 1 TagFrageWindows Server11 Kommentare

Hallo zusammen, ich bin tatsächlich einmal auf eure Hilfe angewiesen! Ich habe für unser Unternehmen ein Domänennetzwerk auf einem Rootserver von Netcup erstellt und weitestgehend ...

Microsoft
Wird die durch den DHCP zugewiesene IP-Adresse in der Ereignisanzeige gespeichert?
stephan.csVor 1 TagFrageMicrosoft6 Kommentare

Guten Morgen zusammen, leider bin ich mit meiner Recherche bis jetzt nicht weiter gekommen. Darum die Frage Wir haben folgende Situation: - Windows 10 Clients ...

Installation
Setup mit automatischen Klicks
akadawaVor 1 TagFrageInstallation9 Kommentare

Moin, ich habe eine Installation welche ich gerne über das Softwarecenter vom SCCM installieren lassen möchte. Leider lassen die Parameter der Setup.exe es nicht zu, ...

Windows Netzwerk
PRTG Probe erkennt Lancom Router nicht mehr
gelöst blackarchVor 1 TagFrageWindows Netzwerk6 Kommentare

Hallo zusammen, die o.g. Probe ist auf dem Server eines Standortes installiert und lief bis dato problemlos. Gestern fiel nun der Ping für den Router ...

Windows 10
PDF Datei wird falsch angezeigt
ben1300Vor 1 TagFrageWindows 107 Kommentare

Hallo zusammen, habe hier eine PDF Datei, welche auf einem Macbook (Big Sur) und einem Windows 10 Prof. x64 Client problemlos dargestellt wird. Nun kommt ...

TK-Netze & Geräte
Starface mit NGN verliert Gateway
FabezzVor 17 StundenFrageTK-Netze & Geräte9 Kommentare

Guten Morgen zusammen, ich hoffe dass ich das richtige Thema getroffen habe. In unserer Firma wurde beschlossen dass die in die Tage gekommene Openscape ausgetauscht ...