none
SQL Abfrage mit WITH UNION RRS feed

  • 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?


    Donnerstag, 8. Juni 2017 13:49

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]

    Donnerstag, 8. Juni 2017 14:02

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

    Donnerstag, 8. Juni 2017 14:01
    Moderator
  • 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]

    Donnerstag, 8. Juni 2017 14:02
  • Das wusste ich nicht! Danke für die Info!
    Montag, 12. Juni 2017 12:40