BASE DE CONNAISSANCES

Utilisation d'expressions de table courantes


Date de publication : 20 Dec 2016
Date de dernière modification : 20 Jul 2023

Question

Comment utiliser des expressions de table courantes (CTE) dans Tableau.
 

Environnement

  • Tableau Desktop
  • SQL Server
  • Teradata
  • IBM DB2

Réponse

  1. Sélectionnez Données > Nouvelle source de données et choisissez la source de données souhaitée.
  2. Dans la boîte de dialogue Connexion au serveur, choisissez SQL initial.
  3. 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

     
  4. 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
     
Avec une table d'employés de ce type :

ID

Nom

ManagerID

1

John

NULL

2

Jim

1

3

Jane

1

4

Tom

3

5

Bob

4

6

Rob

3

7

Mike

1

La solution ci-dessous retournerait un résultat de ce type : 

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)
Cet article vous a-t-il permis de résoudre le problème ?