Data dell'ultima modifica: 20 Jul 2023
Ambiente
- Tableau Desktop
- SQL Server
- Teradata
- IBM DB2
Risposta
- Seleziona Dati > Nuova origine dati e scegli l'origine dati che desideri.
- Nella finestra di dialogo Connessione server, scegli SQL iniziale.
- Inserisci le tue CTE nel campo SQL iniziale.
L'esempio che segue utilizza un self join ricorsivo sulla tabella "Dipendenti" per creare una gerarchia di reporting dei dipendenti utilizzando un'espressione di tabella comune chiamata Organigramma. La sintassi varia leggermente a seconda dell'origine dati.
Per SQL Server, creiamo una tabella temporanea locale usando SELECT INTO [Nome Tabella Temp] invece che SELECT alla fine della query:
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
Per Teradata, creiamo una tabella temporanea utilizzando CREATE VOLATILE TABLE [Nome Tabella Temp]:
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
Per 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
- Crea una query SQL personalizzata che sceglie dalla tabella temporanea in cui hai inserito i record.
Ad esempio, in SQL Server:
SELECT * from #ctedemo
in Teradata:
SELECT * from ctedemo
in IBM DB2:
SELECT * FROM SESSION.ctedemo
ID |
Nome |
ManagerID |
1 |
John |
NULL |
2 |
Jim |
1 |
3 |
Jane |
1 |
4 |
Tom |
3 |
5 |
Bob |
4 |
6 |
Rob |
3 |
7 |
Mike |
1 |
ID |
Nome |
Livello |
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 |
Ulteriori informazioni
Quando Tableau esegue una query a un'origine dati, SQL personalizzato viene passato in una query come la seguente:SELECT TOP 1 * da ( [Tutti i tuoi SQL personalizzati qui] ) come [TableauSQL]
SQL Server e Teradata non supportano l'uso di CTE in una sottoquery, quindi il risultato è un errore.
SQL iniziale non viene passato in una sottoquery, quindi può essere utilizzato per una CTE.
Per esprimere il tuo supporto affinché questa caratteristica venga inclusa in una versione futura del prodotto, vota l'idea proposta nella Community:
Compatibilità CTE con il server SQL (v. 10.0)
Grazie per aver inviato il tuo feedback sull'efficacia dell'articolo.
Apri nuovo caso
Continua la ricerca
Knowledge base
Community
Guida
Formazione e tutorial