RECURSIVE in SELECT bei MariaDB

Guten Tag,
ich möchte einen Selcet-Befehl mit “WITH RECURSIVE” einbinden. Über HeidiSQL funktioniert der folgenden SELECT-Befehl:

WITH RECURSIVE category_path (catID, title, root) AS
(
  SELECT shop_categories.id as catID, shop_categories.name_deu, shop_categories.name_deu as root
    FROM shop_categories
    WHERE parent_id = 0
  UNION ALL
  SELECT c.id, c.name_deu, CONCAT(cp.root)
    FROM category_path AS cp JOIN shop_categories AS c
      ON cp.catID = c.parent_id
)

SELECT shop_articles.id, art_nr, name_deu, menge, merkmal1.merkmal_deu AS merkmal1, merkmal2.merkmal_deu AS merkmal2, wert1.wert_deu AS wert1, wert2.wert_deu AS wert2, root AS hauptgruppe
FROM shop_articles
INNER JOIN shop_articles_info
ON shop_articles.parent_id = shop_articles_info.id
LEFT JOIN shop_werte wert1
ON wert1=wert1.id
LEFT JOIN shop_werte wert2
ON wert2=wert2.id
LEFT JOIN shop_merkmale merkmal1
ON merkmal1=merkmal1.id
LEFT JOIN shop_merkmale merkmal2
ON merkmal2=merkmal2.id
LEFT JOIN (SELECT parent_id AS parentId, cat_id As catId, root
           FROM shop_article_to_cats
           LEFT JOIN category_path 
           ON category_path.catID = shop_article_to_cats.cat_id) AS artCat
ON artCat.parentId = shop_articles.id

Bei der Erstelleung der Datenquelle kommt folgenden Fehlermeldung:

Unknown column ‘cp.catID’ in ‘on clause’

Kann man da irgendwas machen oder sind diese Befehle nicht erlaubt?

Gruß Dennis

Je nach Datenquelle könnten Sie einmal versuchen, die Eigenschaft MinimalSelect auf false zu setzen. Dann werden die Statements in aller Regel direkt an den Treiber weitergegeben. Wenn das nichts hilft müssten Sie uns einmal ein paar Details zum Datenprovider geben, so dass wir versuchen könnten, das Problem nachzustellen.

Die Datenquelle ist eine MaraiDB. Benutze auf dem Combit-Report-Server auch den Datenquellen-Typ “MariaDB”. Dort finde ich leider nicht die Eigenschaft “MinimalSelect”.

Bei der Tabelle, wo ich den “RECURSIVE”-Befehl nutzen will, handelt es sich um eine Baumstruktur. Ziel bei dem SQL-Befehl ist es, zu jedem Eintrag den obersten Parent (Root-Parent) zu bekommen.
Aufbau: ID, ParentID, Name
Ziel: ID, Name, Name des Root-Parents

Vielleicht gibt es auch ein anderen Weg, dieses Ziel zu erreichen?

Hallo!
Evtl. kannst du die ganze Abfrage in eine Stored Procedure packen.
Es könnte sein, dass der Resport Server auch MySQL-Prozeduren als Datenquelle kann.

Ansonsten kommt die Meldung ja auch vom Datenbankserver. Allerdings packt der RS ja noch ein SELECT um die ganze Abfrage herum. Du musst das also auch simulieren, wenn du die genaue Abfrage in HeidiSQL nachbauen willst.

Grüße

HP

Hallo :slight_smile:
Die Abfrage funktioniert auch bei HeidiSQL, wenn ich den Befehl in ein SELECT-Befehl baue:
Diesen habe ich dort soagr noch etwas komplizierter gemacht :smiley:
Aber auch wenn ich diesen ein zu eins kopiere kommt der geleiche Fehler.

SELECT * FROM (
WITH RECURSIVE category_path AS
(
  SELECT shop_categories.id, shop_categories.name_deu, shop_categories.name_deu as root
    FROM shop_categories
    WHERE parent_id = 0
  UNION ALL
  SELECT c.id, c.name_deu, CONCAT(cp.root)
    FROM category_path AS cp JOIN shop_categories AS c
      ON cp.id = c.parent_id
)

SELECT shop_articles.id, art_nr, name_deu, menge, merkmal1.merkmal_deu AS merkmal1, merkmal2.merkmal_deu AS merkmal2, wert1.wert_deu AS wert1, wert2.wert_deu AS wert2, root AS hauptgruppe
FROM shop_articles
INNER JOIN shop_articles_info
ON shop_articles.parent_id = shop_articles_info.id
LEFT JOIN shop_werte wert1
ON wert1=wert1.id
LEFT JOIN shop_werte wert2
ON wert2=wert2.id
LEFT JOIN shop_merkmale merkmal1
ON merkmal1=merkmal1.id
LEFT JOIN shop_merkmale merkmal2
ON merkmal2=merkmal2.id
LEFT JOIN (SELECT parent_id AS parentId, cat_id As catId, root
           FROM shop_article_to_cats
           LEFT JOIN category_path 
           ON category_path.id = shop_article_to_cats.cat_id) AS artCat
ON artCat.parentId = shop_articles.id
) AS Artikel

Das mit der Stored Procedure muss ich mir mal genauer anschauen.

Gruß Dennis

© combit GmbH