Fecha de la última modificación: 20 Jul 2023
Entorno
- Tableau Desktop
- SQL Server
- Teradata
- IBM DB2
Respuesta
- Seleccione Datos > Nueva fuente de datos y elija la fuente de datos que desee.
- En el cuadro de diálogo Conexión de servidor, seleccione SQL inicial.
- Escriba la CTE en el campo SQL inicial.
En el ejemplo siguiente se utiliza una unión automática recurrente en la tabla "Employees" (Empleados) para crear una jerarquía de generación de informes de empleados mediante una expresión de tabla común denominada OrganizationChart. La sintaxis varía ligeramente en función de la fuente de datos.
Para SQL Server, creamos una tabla temporal local mediante SELECT INTO [Nombre de la tabla temporal] en lugar de utilizar SELECT al final de la 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 Teradata, creamos una tabla temporal utilizando CREATE VOLATILE TABLE [Nombre de la tabla temporal]:
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
- Cree una consulta SQL personalizada que haga una selección de la tabla temporal en la que insertó los registros.
Por ejemplo, en SQL Server:
SELECT * from #ctedemo
En Teradata:
SELECT * from ctedemo
En IBM DB2:
SELECT * FROM SESSION.ctedemo
ID |
Nombre |
ManagerID |
1 |
John |
NULL |
2 |
Jim |
1 |
3 |
Jane |
1 |
4 |
Tom |
3 |
5 |
Bob |
4 |
6 |
Rob |
3 |
7 |
Mike |
1 |
ID |
Nombre |
Nivel |
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 |
Información adicional
Cuando Tableau consulta una fuente de datos, el SQL personalizado se pasa en una consulta como esta:SELECT TOP 1 * from ( [All your Custom SQL here] ) as [TableauSQL]
SQL Server y Teradata no admiten el uso de CTE en una subconsulta, por tanto da como resultado un error.
El SQL inicial no se pasa en una subconsulta, por lo que se puede utilizar para una CTE.
Para darnos su apoyo para incluir esta característica en una próxima versión del producto, añada su voto a la siguiente idea de la comunidad:
Compatibilidad de CTE con SQL Server (v. 10.0)
Gracias por brindarnos sus comentarios sobre la eficacia de este artículo.
Abrir nuevo Caso
Continuar buscando
Base de conocimiento
Comunidad
Ayuda sobre los productos
Capacitación y tutoriales