Data da última modificação: 20 Jul 2023
Ambiente
- Tableau Desktop
- SQL Server
- Teradata
- IBM DB2
Resposta
- Selecione Dados > Nova fonte de dados e escolha a fonte de dados desejada.
- Na caixa de diálogo Conexão de servidor, escolha SQL inicial.
- Insira o CTE no campo SQL incial.
O exemplo abaixo usa uma autoassociação recursiva na tabela "Funcionários" para criar uma hierarquia de relatório de funcionário usando uma expressão de tabela comum chamada OrganizationChart. A sintaxe difere um pouco dependendo da fonte de dados.
Para o SQL Server, criamos uma tabela local temporária usando SELECT INTO [Temp Table Name] em vez de SELECT no fim da consulta:
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
Para o Teradata, criamos uma tabela temporária usando CREATE VOLATILE TABLE [Temp Table Name]:
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
Para 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
- Crie uma consulta de SQL personalizado que seleciona a partir da tabela temporária inserida nos registros.
Por exemplo, no SQL Server:
SELECT * from #ctedemo
No Teradata:
SELECT * from ctedemo
No IBM DB2:
SELECT * FROM SESSION.ctedemo
ID |
Nome |
ManagerID |
1 |
John |
NULO |
2 |
Jim |
1 |
3 |
Jane |
1 |
4 |
Tom |
3 |
5 |
Bob |
4 |
6 |
Rob |
3 |
7 |
Mike |
1 |
ID |
Nome |
Nível |
ManagerID |
1 |
John |
0 |
NULO |
2 |
Jim |
1 |
1 |
3 |
Jane |
1 |
1 |
7 |
Mike |
1 |
1 |
4 |
Tom |
2 |
3 |
6 |
Rob |
2 |
3 |
5 |
Bob |
3 |
4 |
Informações adicionais
Quando o Tableau consulta uma fonte de dados, o SQL personalizado é transferido em uma consulta como a seguinte:SELECT TOP 1 * from ( [All your Custom SQL here] ) as [TableauSQL]
O SQL Server e Teradata não suportam o uso do CTE em uma subconsulta, então resulta em erro.
O SQL inicial não é transmitido em uma subconsulta, portanto pode ser usado para uma CTE.
Para dar voz a seu suporte à inclusão deste recurso em uma versão futura do produto, adicione seu voto na seguinte Community Idea:
Compatibilidade CTE com o SQL Server (v. 10.0)
Obrigado por fornecer seu feedback sobre a eficácia deste artigo.
Abrir novo processo
Continuar a pesquisa
Base de dados de conhecimento
Comunidade
Ajuda do produto
Treinamento e tutoriais
Links relacionados
Your query has an error: Request Error.
Trending Articles
Your query has an error: Request Error.