Zuletzt geändert am: 20 Jul 2023
Umgebung
- Tableau Desktop
- SQL Server
- Teradata
- IBM DB2
Antwort
- Wählen Sie Daten > Neue Datenquelle und dann die gewünschte Datenquelle aus.
- Wählen Sie im Dialogfeld „Serververbindung“ die Option SQL-Anfangsdaten aus.
- Geben Sie im Feld „SQL-Anfangsdaten“ Ihren allgemeinen Tabellenausdruck ein.
Im nachfolgenden Beispiel wird eine rekursive Selbstverknüpfung für die Tabelle 'Employees' verwendet, um eine Mitarbeiterberichtshierarchie mithilfe eines allgemeinen Tabellenausdrucks mit dem Namen 'OrganizationChart' zu erstellen. Die Syntax kann sich je nach Datenquelle etwas unterscheiden.
Für den SQL Server wird anstelle von SELECT am Ende der Abfrage eine lokale temporäre Tabelle mithilfe von SELECT INTO [Temp Table Name] erstellt:
WITH OrganizationChart (Id, [Name], [Level], ManagerID) AS (
SELECT
Id, [Name], 0 as [Level], ManagerID
FROM
[dbo].[Employees] emp
WHERE
ManagerID IS NULL
UNION ALL
SELECT
emp.ID, emp.[Name], [Level] + 1, emp.ManagerID
FROM [dbo].[Employees] emp
INNER JOIN OrganizationChart d ON
emp.ManagerID = d.Id
)
SELECT [Id], [Name], [Level], [ManagerID] INTO #ctedemo from OrganizationChart
Für Teradata wird eine temporäre Tabelle mithilfe von CREATE VOLATILE TABLE [Temp Table Name] erstellt:
CREATE VOLATILE TABLE ctedemo AS (WITH RECURSIVE OrganizationChart (Id, Name, Level, ManagerID) AS (
SELECT
Id, Name, 0 as Level, ManagerID
FROM
TEST.Employees emp
WHERE
ManagerID IS NULL
UNION ALL
SELECT
emp.ID, emp.Name, Level + 1, emp.ManagerID
FROM TEST.Employees emp
INNER JOIN OrganizationChart d ON
emp.ManagerID = d.Id
) SELECT Id, Name, Level, ManagerID from OrganizationChart) WITH DATA NO PRIMARY INDEX
ON COMMIT PRESERVE ROWS
Für IBM DB2:
DECLARE GLOBAL TEMPORARY TABLE SESSION.ctedemo(ID int, Name varchar(50), Level int, ManagerID int) on commit preserve rows with replace not logged;
INSERT INTO SESSION.ctedemo(ID, Name, Level, ManagerID) WITH OrganizationChart (Id, Name, Level, ManagerID) AS (
SELECT
Id, Name, 0 as Level, ManagerID
FROM
Employees emp
WHERE
ManagerID IS NULL
UNION ALL
SELECT
emp.ID, emp.Name, Level + 1, emp.ManagerID
FROM Employees emp, OrganizationChart d
where
emp.ManagerID = d.Id
)
SELECT Id, Name, Level, ManagerID from OrganizationChart
- Erstellen Sie eine benutzerdefinierte SQL-Abfrage, die eine Auswahl aus der temporären Tabelle vornimmt, in die Sie die Datensätze eingefügt haben.
Zum Beispiel in SQL Server:
SELECT * from #ctedemo
In Teradata:
SELECT * from ctedemo
In IBM DB2:
SELECT * FROM SESSION.ctedemo
ID |
Name |
ManagerID |
1 |
John |
NULL |
2 |
Jim |
1 |
3 |
Jane |
1 |
4 |
Tom |
3 |
5 |
Bob |
4 |
6 |
Rob |
3 |
7 |
Mike |
1 |
ID |
Name |
Level |
ManagerID |
1 |
John |
0 |
NULL |
2 |
Jim |
1 |
1 |
3 |
Jane |
1 |
1 |
7 |
Mike |
1 |
1 |
4 |
Tom |
2 |
3 |
6 |
Rob |
2 |
3 |
5 |
Bob |
3 |
4 |
Zusätzliche Informationen
Wenn Tableau eine Datenquelle abfragt, wird benutzerdefinierter SQL-Code in einer Abfrage wie folgt übergeben:SELECT TOP 1 * from ( [All your Custom SQL here] ) as [TableauSQL]
SQL Server und Teradata unterstützen die Verwendung allgemeiner Tabellenausdrücke in einer Teilabfrage nicht. Daher ist das Ergebnis ein Fehler.
SQL-Anfangsdaten werden nicht in einer Teilabfrage weitergegeben und können so für CTE verwendet werden.
Wenn Sie die Einbettung dieser Funktion bei zukünftigen Produktversionen unterstützen möchten, stimmen Sie in der folgenden Community-Idee dafür:
CTE-Kompatibilität mit SQL-Server (v. 10.0)
Vielen Dank für Ihr Feedback zur Effektivität dieses Artikels.
Neuen Supportfall öffnen
Suche fortsetzen
Knowledge Base
Community
Produkthilfe
Schulungen und Lernprogramme
Verwandte Links
Your query has an error: Request Error.
Trending Articles
Your query has an error: Request Error.