Date de dernière modification : 20 Jul 2023
Environnement
- Tableau Desktop
- SQL Server
- Teradata
- IBM DB2
Réponse
- Sélectionnez Données > Nouvelle source de données et choisissez la source de données souhaitée.
- Dans la boîte de dialogue Connexion au serveur, choisissez SQL initial.
- Entrez votre CTE dans le champ SQL initial.
L'exemple ci-dessous utilise une liaison automatique récursive sur la table « Employees » pour créer un système hiérarchique d'employés à l'aide d'une expression de table courante appelée OrganizationChart. La syntaxe diffère légèrement selon la source de données.
Pour SQL Server, nous créons une table temporaire locale en utilisant SELECT INTO [Nom Table Temp] plutôt que SELECT à la fin de la requête :
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
Pour Teradata, nous créons une table temporaire en utilisant CREATE VOLATILE TABLE [Nom Table 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
Pour 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
- Créez une requête SQL personnalisée qui effectue une sélection dans la table temp dans laquelle vous avez inséré les enregistrements.
Par exemple, dans SQL Server :
SELECT * from #ctedemo
Dans Teradata :
SELECT * from ctedemo
Dans IBM DB2 :
SELECT * FROM SESSION.ctedemo
ID |
Nom |
ManagerID |
1 |
John |
NULL |
2 |
Jim |
1 |
3 |
Jane |
1 |
4 |
Tom |
3 |
5 |
Bob |
4 |
6 |
Rob |
3 |
7 |
Mike |
1 |
ID |
Nom |
Niveau |
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 |
Informations supplémentaires
Lorsque Tableau interroge une source de données, SQL personnalisé est transmis dans une requête comme suit :SELECT TOP 1 * from ( [All your Custom SQL here] ) as [TableauSQL]
SQL Server et Teradata ne prennent pas en charge l'utilisation de CTE dans une requête secondaire, ce qui génère une erreur.
SQL initial n'est pas transmis dans une requête secondaire et peut donc être utilisé pour un CTE.
Pour apporter votre soutien à l'inclusion de cette fonctionnalité dans une version future du produit, ajoutez votre vote à l'idée de communauté suivante :
Compatibilité de CTE avec SQL Server (v. 10.0)
Merci de nous avoir donné votre avis sur l’efficacité de l’article.
Ouvrir un nouveau cas
Continuer la recherche
Base de connaissances
Communauté
Aide produit
Formation et tutoriels