Benutzer mit den meisten Antworten
SQL Abfrage mit WITH UNION

Frage
-
Hallo an alle,
ich würde gern zwei SQL Abfragen mit WITH das Ergebnis mit UNION zusammenfügen.
Jedoch geht das nicht? Warum?
With Vorberechnung as ( SELECT V.[ID] ,V.[TimeStamp_Start] ,V.[TimeStamp_Stop] ,V.Verwendung FROM [TEST].[dbo].[Produktionszeiten] as V ) SELECT V.ID, V.[TimeStamp_Start], V.[TimeStamp_Stop] ,min([Starttemperatur_FB5_1]) as Min_Temp ,max([Starttemperatur_FB5_1]) as Max_Temp ,V.Verwendung FROM [TEST].[dbo].[TREND009] AS T1 INNER JOIN Vorberechnung as V on [Time_Stamp] between V.[TimeStamp_Start] and V.[TimeStamp_Stop] where V.Verwendung = 'Fällbehälter_5_1' group by ID,TimeStamp_Start,TimeStamp_Stop, Verwendung union all With Vorberechnung as ( SELECT V.[ID] ,V.[TimeStamp_Start] ,V.[TimeStamp_Stop] ,V.Verwendung FROM [TEST].[dbo].[Produktionszeiten] as V ) SELECT V.ID, V.[TimeStamp_Start], V.[TimeStamp_Stop] ,min([Starttemperatur_FB5_2]) as Min_Temp ,max([Starttemperatur_FB5_2]) as Max_Temp ,V.Verwendung FROM [TEST].[dbo].[TREND009] AS T1 INNER JOIN Vorberechnung as V on [Time_Stamp] between V.[TimeStamp_Start] and V.[TimeStamp_Stop] where V.Verwendung = 'Fällbehälter_5_2' group by ID,TimeStamp_Start,TimeStamp_Stop, Verwendung ;
Fehlermeldung:Falsche Syntax in der Nähe des WITH-Schlüsselworts. Falls diese Anweisung ein allgemeiner Tabellenausdruck, eine XMLNAMESPACES-Klausel oder eine CHANGE TRACKING CONTEXT-Klausel ist, muss die vorherige Anweisung mit einem Semikolon abgeschlossen werden.
Aber wo soll da bitteschön ein Semikolon hin? Die Fehlermeldung macht doch garkeinen Sinn oder?
Antworten
-
Hallo,
die WITH Klausel darf es pro Statement nur einmal geben. Da die beiden bei Dir ehe identisch sind, macht eine zweite auch keinen Sinn und kannst Du einfach weg lassen. So sollte es bereits gehen:
With Vorberechnung as ( SELECT V.[ID] ,V.[TimeStamp_Start] ,V.[TimeStamp_Stop] ,V.Verwendung FROM [TEST].[dbo].[Produktionszeiten] as V ) SELECT V.ID, V.[TimeStamp_Start], V.[TimeStamp_Stop] ,min([Starttemperatur_FB5_1]) as Min_Temp ,max([Starttemperatur_FB5_1]) as Max_Temp ,V.Verwendung FROM [TEST].[dbo].[TREND009] AS T1 INNER JOIN Vorberechnung as V on [Time_Stamp] between V.[TimeStamp_Start] and V.[TimeStamp_Stop] where V.Verwendung = 'Fällbehälter_5_1' group by ID,TimeStamp_Start,TimeStamp_Stop, Verwendung union all SELECT V.ID, V.[TimeStamp_Start], V.[TimeStamp_Stop] ,min([Starttemperatur_FB5_2]) as Min_Temp ,max([Starttemperatur_FB5_2]) as Max_Temp ,V.Verwendung FROM [TEST].[dbo].[TREND009] AS T1 INNER JOIN Vorberechnung as V on [Time_Stamp] between V.[TimeStamp_Start] and V.[TimeStamp_Stop] where V.Verwendung = 'Fällbehälter_5_2' group by ID,TimeStamp_Start,TimeStamp_Stop, Verwendung ;
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort vorgeschlagen Uwe RickenMVP Montag, 12. Juni 2017 06:35
- Als Antwort markiert Toot_Braunstein Montag, 12. Juni 2017 12:40
Alle Antworten
-
Hi,
doch, die Meldung macht schon Sinn. Der Parser weiß halt nicht genau, was Du da fabrizierst. Dein Konstrukt ist so nicht gültig, daher gibt dir die Fehlermeldung die möglichen Hinweise.
Lösung generell: Entweder lagerst Du die beiden Abfragen inkl. des jeweilig zugehörigen WITH ... in eine eigene View aus und liest dann nur diese aus oder Du baust es in etwa wie folgt auf:
With Vorberechnung1 as ( SELECT V.[ID] ,V.[TimeStamp_Start] ,V.[TimeStamp_Stop] ,V.Verwendung FROM [TEST].[dbo].[Produktionszeiten] as V ), Berechnung1 AS ( SELECT V.ID, V.[TimeStamp_Start], V.[TimeStamp_Stop] ,min([Starttemperatur_FB5_1]) as Min_Temp ,max([Starttemperatur_FB5_1]) as Max_Temp ,V.Verwendung FROM [TEST].[dbo].[TREND009] AS T1 INNER JOIN Vorberechnung1 as V on [Time_Stamp] between V.[TimeStamp_Start] and V.[TimeStamp_Stop] where V.Verwendung = 'Fällbehälter_5_1' group by ID,TimeStamp_Start,TimeStamp_Stop, Verwendung ), Vorberechnung2 as ( SELECT V.[ID] ,V.[TimeStamp_Start] ,V.[TimeStamp_Stop] ,V.Verwendung FROM [TEST].[dbo].[Produktionszeiten] as V ), Berechnung2 AS () SELECT V.ID, V.[TimeStamp_Start], V.[TimeStamp_Stop] ,min([Starttemperatur_FB5_2]) as Min_Temp ,max([Starttemperatur_FB5_2]) as Max_Temp ,V.Verwendung FROM [TEST].[dbo].[TREND009] AS T1 INNER JOIN Vorberechnung2 as V on [Time_Stamp] between V.[TimeStamp_Start] and V.[TimeStamp_Stop] where V.Verwendung = 'Fällbehälter_5_2' group by ID,TimeStamp_Start,TimeStamp_Stop, Verwendung ; ) SELECT ... FROM Berechnung1 union all SELECT ... FROM Berechnung2
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo,
die WITH Klausel darf es pro Statement nur einmal geben. Da die beiden bei Dir ehe identisch sind, macht eine zweite auch keinen Sinn und kannst Du einfach weg lassen. So sollte es bereits gehen:
With Vorberechnung as ( SELECT V.[ID] ,V.[TimeStamp_Start] ,V.[TimeStamp_Stop] ,V.Verwendung FROM [TEST].[dbo].[Produktionszeiten] as V ) SELECT V.ID, V.[TimeStamp_Start], V.[TimeStamp_Stop] ,min([Starttemperatur_FB5_1]) as Min_Temp ,max([Starttemperatur_FB5_1]) as Max_Temp ,V.Verwendung FROM [TEST].[dbo].[TREND009] AS T1 INNER JOIN Vorberechnung as V on [Time_Stamp] between V.[TimeStamp_Start] and V.[TimeStamp_Stop] where V.Verwendung = 'Fällbehälter_5_1' group by ID,TimeStamp_Start,TimeStamp_Stop, Verwendung union all SELECT V.ID, V.[TimeStamp_Start], V.[TimeStamp_Stop] ,min([Starttemperatur_FB5_2]) as Min_Temp ,max([Starttemperatur_FB5_2]) as Max_Temp ,V.Verwendung FROM [TEST].[dbo].[TREND009] AS T1 INNER JOIN Vorberechnung as V on [Time_Stamp] between V.[TimeStamp_Start] and V.[TimeStamp_Stop] where V.Verwendung = 'Fällbehälter_5_2' group by ID,TimeStamp_Start,TimeStamp_Stop, Verwendung ;
Olaf Helper
[ Blog] [ Xing] [ MVP]- Als Antwort vorgeschlagen Uwe RickenMVP Montag, 12. Juni 2017 06:35
- Als Antwort markiert Toot_Braunstein Montag, 12. Juni 2017 12:40