Anna85: xml, Meldung 102, Falsche Syntax in der Nähe von ";".

Hallo, ich habe hier an sich einfache join Abfrage, allerdings bekomme ich Syntax Fehler, die Abfrage ist:

select 
	tab.id as '@id',
	
			farbe as 'v1:zusatz'
			
					from tab

				left join (  
					Select 
					'gruppe' as '@logicalName',
					fachgebiet as '@key'
					from tab
					)

Der Fehler zeigt auf die letzte Zeile mit ")". Was ist dann falsch?

Danke im Voraus !

  1. Hi,

    select 
    	tab.id as '@id',
    	
    			farbe as 'v1:zusatz'
    			
    					from tab
    
    				left join (  
    					Select 
    					'gruppe' as '@logicalName',
    					fachgebiet as '@key'
    					from tab
    					)
    

    Der Fehler zeigt auf die letzte Zeile mit ")". Was ist dann falsch?

    ich kenn mssql nicht wirklich, aber bei einem join erwarte ich eine join-Bedingung (a la left join Tabelle on bla = blubb)

    cu,
    Andreas a/k/a MudGuard

    1. Hi, danke für deine Antwort, aber hier: https://docs.microsoft.com/de-de/sql/relational-databases/performance/subqueries?view=sql-server-ver15 ist auch mit join und kommt keine Bedingung.

      Ich habe jetzt mit Bedingung, dann habe ich noch mehr Meldungen:

      select 
      	tab.id as '@id',
      	
      			farbe as 'v1:zusatz'
      			
      					from tab
      
      				left join tab on tab.id=tab.id (  
      					Select 
      					'gruppe' as '@logicalName',
      					fachgebiet as '@key'
      					from tab
      					)
      

      Jetzt habe ich noch die Meldungen:

      Meldung 156, Ebene 15, Status 1, Zeile 22
      Falsche Syntax in der Nähe des Select-Schlüsselworts.
      Meldung 102, Ebene 15, Status 1, Zeile 27
      Falsche Syntax in der Nähe von ")".
      

      Kann mir jemand helfen?

      1. Hallo

        Hi, danke für deine Antwort, aber hier: https://docs.microsoft.com/de-de/sql/relational-databases/performance/subqueries?view=sql-server-ver15 ist auch mit join und kommt keine Bedingung.

        Das Beispiel aus der MS-Doku sieht aber schon auf dem ersten Blick gänzlich anders aus.

        Ich habe jetzt mit Bedingung, dann habe ich noch mehr Meldungen:

        select 
        	tab.id as '@id',
        	
        			farbe as 'v1:zusatz'
        			
        					from tab
        
        				left join tab on tab.id=tab.id (  
        					Select 
        					'gruppe' as '@logicalName',
        					fachgebiet as '@key'
        					from tab
        					)
        

        Jetzt habe ich noch die Meldungen: Meldung 156, Ebene 15, Status 1, Zeile 22 Falsche Syntax in der Nähe des Select-Schlüsselworts. Meldung 102, Ebene 15, Status 1, Zeile 27 Falsche Syntax in der Nähe von ")".

        Das liegt schon allein daran, dass der Subquery hinter dem JOIN so nichts zu suchen hat. Subqueries können zwischen SELECT und FROM stehen, um dem Ergebnis jeweils einen weiteren Wert hinzuzufügen oder zum Beispiel Teil einer WHERE-Bedingung sein. So ganz allein stehend, direkt hinter einem JOIN, sind sie falsch am Platze. Zudem soll als Ergebnis des Subqueries immer nur ein Wert oder eine Menge aus einer Spalte herausfallen.

        Wie sieht die Struktur der an dieser Abfrage beteiligten Tabellen aus? Was soll als Ergebnis der Abfrage herauskommen?

        Tschö, Auge

        --
        Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
        Hohle Köpfe von Terry Pratchett
        1. Hi,

          Das liegt schon allein daran, dass der Subquery hinter dem JOIN so nichts zu suchen hat.

          sagt wer?

          Oracle sagt z.B.

             [FROM table_references
                [PARTITION partition_list]]
              [WHERE where_condition]
          
          table_references:
              escaped_table_reference [, escaped_table_reference] ...
          
          table_reference:
              table_factor
            | joined_table
          
          table_factor:
              tbl_name [PARTITION (partition_names)]
                  [[AS] alias] [index_hint_list]
            | table_subquery [AS] alias
            | ( table_references )
          
          joined_table:
              table_reference [INNER | CROSS] JOIN table_factor [join_specification]
            | table_reference STRAIGHT_JOIN table_factor
            | table_reference STRAIGHT_JOIN table_factor ON search_condition
            | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference join_specification
            | table_reference NATURAL [{LEFT|RIGHT} [OUTER]] JOIN table_factor
          
          
           A table_subquery is also known as a derived table or subquery in the FROM clause. See Section 13.2.10.8, “Derived Tables”. Such subqueries must include an alias to give the subquery result a table name. A trivial example follows:
          
          SELECT * FROM (SELECT 1, 2, 3) AS t1;
          

          An der Stelle einer Tabelle kann im select immer auch eine Subquery (mit Alias, ohne geht nicht) stehen.

          In anderen DBMS mag das anders aussehen, aber so absolut wie Du das schreibst, ist das nicht.

          cu,
          Andreas a/k/a MudGuard

          1. Hallo

            Hi,

            Das liegt schon allein daran, dass der Subquery hinter dem JOIN so nichts zu suchen hat.

            sagt wer?

            Oracle sagt z.B.

            
             A table_subquery is also known as a derived table or subquery in the FROM clause. See Section 13.2.10.8, “Derived Tables”. Such subqueries must include an alias to give the subquery result a table name. A trivial example follows:
            
            SELECT * FROM (SELECT 1, 2, 3) AS t1;
            

            An der Stelle einer Tabelle kann im select immer auch eine Subquery (mit Alias, ohne geht nicht) stehen.

            Über Oracles Datenbanksystem kann ich nichts sagen. Der beispielcode ist aber immer noch etwas anderes als …

            SELECT a1.schnick, a1.schnack FROM a AS a1 LEFT JOIN a AS a2 ON a1.bla = a2.blubb (SELECT 1, 2 FROM a);
            

            … oder verstehe ich das falsch?

            In anderen DBMS mag das anders aussehen, aber so absolut wie Du das schreibst, ist das nicht.

            Wenn ich das richtig verstanden habe, benutzt @Anna85 MS SQL Server.

            Tschö, Auge

            --
            Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
            Hohle Köpfe von Terry Pratchett
          2. Tach!

            Das liegt schon allein daran, dass der Subquery hinter dem JOIN so nichts zu suchen hat.

            sagt wer?

            Die Syntax von SQL im allgemeinen und MS-SQL im speziellen.

            Oracle sagt z.B.

            Auch da kann das Subselect nicht direckt hinter dem Join stehen, sondern erst nach einem Komma.

            dedlfix.

            1. Hi,

              Auch da kann das Subselect nicht direckt hinter dem Join stehen, sondern erst nach einem Komma.

              joined_table:
                  table_reference [INNER | CROSS] JOIN table_factor [join_specification]
                | table_reference STRAIGHT_JOIN table_factor
                | table_reference STRAIGHT_JOIN table_factor ON search_condition
                | table_reference {LEFT|RIGHT} [OUTER] JOIN table_reference 
              

              Direkt nach dem LEFT|RIGHT JOIN darf eine table_reference stehen, direkt nach dem INNER JOIN ein table_factor.

              table_reference:
                  table_factor
                | joined_table
              

              table_reference kann ein table_factor sein. (damit haben wir INNER, LEFT und RIGHT join wieder gemeinsam).

              table_factor:
                  tbl_name [PARTITION (partition_names)]
                      [[AS] alias] [index_hint_list]
                | table_subquery [AS] alias
                | ( table_references )
              

              table_factor kann eine subquery mit Alias sein.

              Wo kommt da jetzt das Komma ins Spiel?

              cu,
              Andreas a/k/a MudGuard

              1. Hallo

                Auch da kann das Subselect nicht direckt hinter dem Join stehen, sondern erst nach einem Komma.

                Direkt nach dem LEFT|RIGHT JOIN darf eine table_reference stehen, direkt nach dem INNER JOIN ein table_factor.

                Dann ist der Subselct aber Teil des JOIN. Im Code von Anna85 folgt der Subselect aber ohne weiteres hinter der JOIN-Anweisung als eine neue Anweisung, die in keinem Bezug zu irgendwas steht.

                SELECT
                  a1.schnick,
                  a1.schnack
                FROM a AS a1
                LEFT JOIN a AS a2 ON a1.bla = a2.blubb
                (SELECT 1, 2 FROM a);
                

                Tschö, Auge

                --
                Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
                Hohle Köpfe von Terry Pratchett
                1. Hallo Auge,

                  ich kenne MS SQL nicht genug um es definitiv zu sagen, aber prinzipiell sind Sub-Selects als Join-Quelle im SQL-Standard erlaubt. PostgreSQL erlaubt sie auch:

                  test=# create table t1 (foo int);
                  CREATE TABLE
                  test=# create table t2 (bar int);
                  CREATE TABLE
                  test=# select * from t1 left join (select * from t2) t2_join on t2_join.bar = t1.foo;
                   foo | bar
                  -----+-----
                  (0 rows)
                  

                  Ich würde vermuten, dass das auch in MS SQL erlaubt ist; es fehlt im OP allerdings der ON-Teil, und der muss IIRC schon da sein.

                  Freundliche Grüße,
                  Christian Kruse

                  1. Hi,

                    Ich würde vermuten, dass das auch in MS SQL erlaubt ist; es fehlt im OP allerdings der ON-Teil, und der muss IIRC schon da sein.

                    das schrubte ich ja schon in meiner ersten Antwort in diesem Thread.

                    cu,
                    Andreas a/k/a MudGuard

                    1. Hallo MudGuard,

                      Ich würde vermuten, dass das auch in MS SQL erlaubt ist; es fehlt im OP allerdings der ON-Teil, und der muss IIRC schon da sein.

                      das schrubte ich ja schon in meiner ersten Antwort in diesem Thread.

                      Ja. Ich wollte dich bestätigen 😀

                      Freundliche Grüße,
                      Christian Kruse

                      1. Tach!

                        Ich würde vermuten, dass das auch in MS SQL erlaubt ist; es fehlt im OP allerdings der ON-Teil, und der muss IIRC schon da sein.

                        das schrubte ich ja schon in meiner ersten Antwort in diesem Thread.

                        Ja. Ich wollte dich bestätigen 😀

                        Ändert nichts daran, dass ihr beide falsch liegt. Sie hat bereits einen Tabellennamen und Join-Bedingung dastehen. Damit ist die table_reference fertig. Danach folgt direkt das Subselect. Das hat dort nichts zu suchen, es sei denn, es ist ein Komma dazwischen, und das Subselect steht somit als weitere table_reference in der FROM-Klausel.

                        dedlfix.

                        1. Hallo dedlfix,

                          Ich würde vermuten, dass das auch in MS SQL erlaubt ist; es fehlt im OP allerdings der ON-Teil, und der muss IIRC schon da sein.

                          das schrubte ich ja schon in meiner ersten Antwort in diesem Thread.

                          Ja. Ich wollte dich bestätigen 😀

                          Ändert nichts daran, dass ihr beide falsch liegt.

                          Einer von uns beiden hat Tomaten auf den Augen. 😉

                          Sie hat bereits einen Tabellennamen und Join-Bedingung dastehen.

                          Ihr Statement ist das hier:

                          select 
                          	...
                          from tab
                          left join (  
                            Select 
                              ...
                            from tab
                          )
                          

                          Das ist direkt aus dem OP kopiert, ich habe nur die Formatierung angepasst und die Feldliste durch ... ersetzt.

                          Mein Statement ist das hier:

                          select
                            ...
                          from t1
                          left join (
                            select
                              ...
                            from t2
                          ) t2_join on t2_join.bar = t1.foo;
                          

                          Meins wird fehlerfrei ausgeführt. Ihrs ist, abgesehen von dem fehlenden ON, äquivalent. Das Subselect im JOIN scheint mir nicht prinzipiell falsch zu sein.

                          Nachwievor allerdings mit der Einschränkung, dass ich MS SQL nicht genau genug kenne um zu wissen, ob es das kann.

                          Freundliche Grüße,
                          Christian Kruse

                          1. Tach!

                            Das ist direkt aus dem OP kopiert,

                            Auges bemängelte Aussage bezog sich aber auf ihr Folgeposting.

                            dedlfix.

                          2. Hallo

                            Einer von uns beiden hat Tomaten auf den Augen. 😉

                            Sie hat bereits einen Tabellennamen und Join-Bedingung dastehen.

                            Ihr Statement ist das hier:

                            select 
                            	...
                            from tab
                            left join (  
                              Select 
                                ...
                              from tab
                            )
                            

                            Das ist direkt aus dem OP kopiert, ich habe nur die Formatierung angepasst und die Feldliste durch ... ersetzt.

                            Wir diskutieren über den von ihr weiterentwickelten Code aus diesem Posting.

                            select 
                            	...
                            			
                            					from tab
                            
                            				left join tab on tab.id=tab.id (  
                            					Select 
                            					...
                            					from tab
                            					)
                            

                            Das ist eben nicht die gleiche Struktur wie im OP.

                            Tschö, Auge

                            --
                            Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
                            Hohle Köpfe von Terry Pratchett
                            1. Hallo Auge,

                              Wir diskutieren über den von ihr weiterentwickelten Code aus diesem Posting.

                              Ach so – ich dachte, das bezieht sich auf das OP. Sorry for the noise.

                              Freundliche Grüße,
                              Christian Kruse

                  2. Hallo

                    ich kenne MS SQL nicht genug um es definitiv zu sagen, aber prinzipiell sind Sub-Selects als Join-Quelle im SQL-Standard erlaubt.

                    Das habe ich nicht infrage gestellt.

                    Ich würde vermuten, dass das auch in MS SQL erlaubt ist; es fehlt im OP allerdings der ON-Teil, und der muss IIRC schon da sein.

                    In der ersten Antwort von Anna auf MudGuard, an der sich diese Diskussion entspann, gibt es den ON-Teil für den JOIN. Der Subselect folgt auf diesen (meiner Meinung nach vollständigen) JOIN, er ist nicht Teil des JOIN.

                    Tschö, Auge

                    --
                    Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
                    Hohle Köpfe von Terry Pratchett
      2. Tach!

        Hi, danke für deine Antwort, aber hier: https://docs.microsoft.com/de-de/sql/relational-databases/performance/subqueries?view=sql-server-ver15 ist auch mit join und kommt keine Bedingung.

        Doch, bei allen dortigen Abfragen folgt hinter dem Tabellennamen nach dem JOIN die Angabe einer Bedingung mit ON.

        Vergleiche mit FROM-Klausel-Syntax

        <joined_table> ::=   
        {  
            <table_source> <join_type> <table_source> ON <search_condition>   
        

        Das ON ist zwingender Bestandteil von expliziten Joins. Bei impliziten Joins (FROM a, b) kann eine Bedingung (in der WHERE-Klausel) wegbleiben, dann entsteht aber ein kartesisches Produkt (jeder Datensatz mit jedem).

        dedlfix.

      3. Hi,

        from tab
        left join tab on tab.id=tab.id (  
        

        und wie soll die Datenbank jetzt wissen, welches tab.id welches ist?

        Hier müßten normalerweise (wie es bei mssql ist, weiß ich nicht) aliase für die Tabellen verwendet werden, also sowas:

        from tab tabaussen
        left join tab tabinnen on tabaussen.id=tabinnen.id (  
        

        cu,
        Andreas a/k/a MudGuard

  2. Hallo Anna85,

    soweit ich weiß, muss eine Table Expression (was der Select hinter deinem LEFT JOIN ist) immer einen Aliasnamen bekommen.

    SQL ist für seine nichtssagenden Fehlermeldungen berüchtigt.

    Die ON Bedingung, die angibt, welche Sätze der geJOINten Tabelle einem Satz der Haupttabelle zugeordnet werden sollen, schreibt man dahinter. Weil ich nicht weiß, wie diese Zuordnung bei Dir erfolgt, schreibe ich statt eines Feldnamens einfach mal Fragezeichen. Und damit das funktioniert, muss die Join-Spalte vom SELECT auch selektiert werden.

    SELECT 	tab.id AS '@id',
    	  		farbe  AS 'v1:zusatz'
    FROM tab 
           LEFT JOIN( Select  'gruppe'    AS '@logicalName',
                               fachgebiet AS '@key'
                       from tab) G
           ON tab.??? = G.???
    

    Ich war ja schon versucht, die Table Expression als sinnlos zu bezeichnen, aber sie ist es nicht. Wenn es kein passendes Fachgebiet gibt, sorgt die Schreibweise mit SELECT dafür, dass auch der logicalName den Wert NULL hat.

    Weitere Hinweise:

    • Du müsstest die in der Table Expression selektierten Spalten irgendwie im Hauptselect verwenden, andernfalls ist der Join sinnlos.
    • Die Spalte farbe verwendest Du ohne Tabellenname oder -alias. Vermutlich ist es tab. Das solltest Du der besseren Verständlichkeit wegen hinschreiben
    • Sind einfache Anführungszeichen um Aliasnamen erlaubt? Wundert mich gerade, aber da Du auch XML in den Tags stehen hast, nehme ich mal an, dass dieses SQL irgendwie in einem XSLT oder so drinsteht und das die Syntax der verwendeten DB ist. Normalerweise müssten es doppelte Anführungszeichen, Backticks oder eckige Klammern sein, je nach DB.

    Rolf

    --
    sumpsi - posui - clusi