xml, Meldung 102, Falsche Syntax in der Nähe von ";".
Anna85
- sql
- xml
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 !
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
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?
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
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
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
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.
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
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
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
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
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
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.
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
Tach!
Das ist direkt aus dem OP kopiert,
Auges bemängelte Aussage bezog sich aber auf ihr Folgeposting.
dedlfix.
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
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
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
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.
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
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:
farbe
verwendest Du ohne Tabellenname oder -alias. Vermutlich ist es tab
. Das solltest Du der besseren Verständlichkeit wegen hinschreibenRolf