Berechnung der euklidischen Norm in SQL-Abfrage

Adriano10

Benutzer
Beiträge
19
Einen schönen guten Tag,

Ich versuche, die euklidische Norm zu berechnen, um den Suchraum zu verkleinern. Leider stoße ich auf ein Problem in der Unterabfrage (SELECT LEVEL FROM SYSIBM.SYSDUMMY1 CONNECT BY LEVEL <= LENGTH(TRIM(s.identifier))), und die genaue Fehlermeldung lautet: SQL-Fehler [42703]: [SQL0206] Spalte oder globale Variable 'identifier' nicht gefunden. Hätte jemand vielleicht eine Idee, wie ich dieses Problem umgehen kann? Oder gibt es alternative Ansätze?

identifier sind die Artikelnummer, z.B 425ITM07

Vielen Dank im Voraus.

Code:
SELECT
  s.identifier,
  SQRT(SUM(CAST(POWER(CAST(ASCII(SUBSTRING(trim(identifier), LEVEL, 1)) AS DOUBLE) / 50.0, 2) AS DOUBLE))) AS l2Norm
FROM
  topic s
CROSS JOIN
  (SELECT LEVEL FROM SYSIBM.SYSDUMMY1 CONNECT BY LEVEL <= LENGTH(TRIM(s.identifier)))
GROUP BY
  s.identifier;
 
Werbung:
Schnelle Idee, wo der Fehler liegen könnte;
Code:
SELECT
  s.identifier,
  SQRT(SUM(CAST(POWER(CAST(ASCII(SUBSTRING(trim(s.identifier), LEVEL, 1)) AS DOUBLE) / 50.0, 2) AS DOUBLE))) AS l2Norm
FROM
  topic s
CROSS JOIN
  (SELECT LEVEL FROM SYSIBM.SYSDUMMY1 CONNECT BY LEVEL <= LENGTH(TRIM(s.identifier)))
GROUP BY
  s.identifier;

du hast in der 2. Spalte nach dem select bei der Spalte "identifier" keine Tabelle angegeben, von wo er das nehmen soll..
nur eine Idee ;)

edit:
2. meiner meinung nach möglicher fehler wäre, dass du nach dem from zwar 2 Quellen angibst, aber keinen beistrich, ich bin gewohnt, das immer mit beistricht zu schreiben, ich weiß nicht, ob hier der fehler "kein" beistrich sein kann.
Code:
SELECT
  s.identifier,
  SQRT(SUM(CAST(POWER(CAST(ASCII(SUBSTRING(trim(s.identifier), LEVEL, 1)) AS DOUBLE) / 50.0, 2) AS DOUBLE))) AS l2Norm
FROM
  topic, s
CROSS JOIN
  (SELECT LEVEL FROM SYSIBM.SYSDUMMY1 CONNECT BY LEVEL <= LENGTH(TRIM(s.identifier)))
GROUP BY
  s.identifier;

edit2:
wenn du von der Quelle "topic" nichts brauchst, würde ich die einfach rausnehmen...

edit3:
gerade versucht, wenn man aus mehreren Quellen (Tabellen) spalten nehmen möchte, muss man die Quellen entsprechend MIT einem Beistrich hintereinanderschreiben ;)
 
Zuletzt bearbeitet:
Schnelle Idee, wo der Fehler liegen könnte;
Code:
SELECT
  s.identifier,
  SQRT(SUM(CAST(POWER(CAST(ASCII(SUBSTRING(trim(s.identifier), LEVEL, 1)) AS DOUBLE) / 50.0, 2) AS DOUBLE))) AS l2Norm
FROM
  topic s
CROSS JOIN
  (SELECT LEVEL FROM SYSIBM.SYSDUMMY1 CONNECT BY LEVEL <= LENGTH(TRIM(s.identifier)))
GROUP BY
  s.identifier;

du hast in der 2. Spalte nach dem select bei der Spalte "identifier" keine Tabelle angegeben, von wo er das nehmen soll..
nur eine Idee ;)

edit:
2. meiner meinung nach möglicher fehler wäre, dass du nach dem from zwar 2 Quellen angibst, aber keinen beistrich, ich bin gewohnt, das immer mit beistricht zu schreiben, ich weiß nicht, ob hier der fehler "kein" beistrich sein kann.
Code:
SELECT
  s.identifier,
  SQRT(SUM(CAST(POWER(CAST(ASCII(SUBSTRING(trim(s.identifier), LEVEL, 1)) AS DOUBLE) / 50.0, 2) AS DOUBLE))) AS l2Norm
FROM
  topic, s
CROSS JOIN
  (SELECT LEVEL FROM SYSIBM.SYSDUMMY1 CONNECT BY LEVEL <= LENGTH(TRIM(s.identifier)))
GROUP BY
  s.identifier;

edit2:
wenn du von der Quelle "topic" nichts brauchst, würde ich die einfach rausnehmen...

edit3:
gerade versucht, wenn man aus mehreren Quellen (Tabellen) spalten nehmen möchte, muss man die Quellen entsprechend MIT einem Beistrich hintereinanderschreiben ;)
Hallo,

vielen Dank erstmal für die Rückmeldung, also identifier ist eine Spalte von der Tabelle topic. Das Alias "s" wird normalerweise verwendet, um auf die Tabelle "topic" zu verweisen und die Schreibarbeit in der Abfrage zu erleichtern. Wenn ich das Alias entferne, die Fehlermeldung bleibt immer noch
Code:
SELECT
  identifier,
  SQRT(SUM(CAST(POWER(CAST(ASCII(SUBSTRING(trim(identifier), LEVEL, 1)) AS DOUBLE) / 50.0, 2) AS DOUBLE))) AS l2Norm
FROM
  topic
CROSS JOIN
  (SELECT LEVEL FROM SYSIBM.SYSDUMMY1 CONNECT BY LEVEL <= LENGTH(TRIM(identifier)))
GROUP BY
  identifier;
 
um ehrlich zu sein würde mich interessieren, ob du dir bewusst bist, wie Cross Join funktioniert?

ich verwende meinerseits Joins nur om Sinne von Verknüpfungen zwischen Tabellen, du versuchst über ein Sub-Select zu joinen, könnte auch ein fehler sein (?)

ein cross-join versucht alle möglichen Verknüpfungen zu "erzeugen", ich habe das Gefühl du versucht mit Sand eine Kirche zu bauen, oder so...
ich würde, wenn es so sein muss, mit einer rekursiven abfrage oder so arbeiten, verwende jedoch PostgreSQL...

gib ein paar mehr Informationen über Tabellenstruktur oder so, vl. gibts eine Lösung die deutlich einfacher ist, vom gedanken her und am ende auch weniger leistung vom Server braucht...

EDIT:
Code:
select id from kunden
cross join
(select name from kunden)

meint er, er braucht einen aliasnamen für den sub-select nach dem cross join

Code:
select id from kunden
cross join
(select name from kunden) as kunden2
 
Der Ausdruck, den du gepostet hast, sieht eher nach SQL aus, das für eine Oracle-Datenbank geschrieben wurde, nicht für MySQL. Es verwendet die Funktionen CONNECT BY und LEVEL, die in Oracle spezifisch sind und für rekursive Abfragen verwendet werden. MySQL verwendet normalerweise andere Syntax für rekursive Abfragen, wie z. B. rekursive Common Table Expressions (CTEs).

In MySQL wäre die Syntax anders. Wenn du ein Äquivalent in MySQL schreiben möchtest, könntest du stattdessen rekursive Common Table Expressions (CTEs) verwenden. Hier ist ein Beispiel:

Code:
WITH RECURSIVE cte AS (
  SELECT 1 AS level
  UNION ALL
  SELECT level + 1 FROM cte WHERE level < LENGTH(TRIM(identifier))
)
SELECT level FROM cte;
 
Werbung:
vielen Besten Dank euch, es funktioniert so
Code:
SELECT
  identifier,
  SQRT(SUM(CAST(POWER(CAST(ASCII(SUBSTRING(trim(identifier), LEVEL, 1)) AS DOUBLE) / 50.0, 2) AS DOUBLE))) AS l2Norm
FROM
  topic
CROSS JOIN
  (SELECT LEVEL
   FROM TABLE (VALUES      (1), (2), (3), (4), (5),
     (6), (7), (8), (9), (10),
     (11), (12), (13), (14), (15),
     (16), (17), (18), (19), (20),
     (21), (22), (23), (24), (25),
     (26), (27), (28), (29), (30),
     (31), (32), (33), (34), (35),
     (36), (37), (38), (39), (40),
     (41), (42), (43), (44), (45),
     (46), (47), (48), (49), (50))
   AS Numbers(LEVEL))
WHERE
  LEVEL <= LENGTH(trim(identifier))
GROUP BY
  identifier;
 
Zurück
Oben