上次修改日期 : 20 Jul 2023
環境
- Tableau Desktop
- SQL Server
- Teradata
- IBM DB2
答案
- 選擇資料 > 新建資料來源,並選擇所需的資料來源。
- 在「伺服器連接」對話方塊中,按一下初始 SQL。
- 在「初始 SQL」欄位中輸入您的 CTE。
以下的範例使用「員工」表上的遞歸自加入用名為 OrganizationChart 的通用表運算式構建員工報告階層。語法根據資料來源略有不同。
對於 SQL Server,我們在查詢結尾使用「SELECT INTO [Temp Table Name]」而非「SELECT」,建立本機暫存表:
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
對於 Teradata,我們使用 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
若使用 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
- 建立一個自訂 SQL 查詢以從您將記錄插入的暫存表中選擇。
例如,在 SQL Server 中:
SELECT * from #ctedemo
在 Teradata 中:
SELECT * from ctedemo
在 IBM DB2 中:
SELECT * FROM SESSION.ctedemo
ID |
名稱 |
ManagerID |
1 |
John |
NULL |
2 |
Jim |
1 |
3 |
Jane |
1 |
4 |
Tom |
3 |
5 |
Bob |
4 |
6 |
Rob |
3 |
7 |
Mike |
1 |
ID |
名稱 |
等級 |
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 |
其他資訊
Tableau 查詢資料來源時,會在如下所示的查詢中傳遞自訂 SQL:SELECT TOP 1 * from ( [All your Custom SQL here] ) as [TableauSQL]
SQL Server 和 Teradata 不支援在子查詢中使用 CTE,所以結果是一個錯誤。
初始 SQL 未在子查詢中傳遞,因此可用於 CTE。
為了表達您對在將來的產品版本中包括此功能的支持,請為以下社群理念投下您的一票:
CTE 與 SQL Server 的相容性 (v.10.0)
感謝您針對本文的效益提供意見回饋。
開啟新案例
繼續搜尋
知識庫
社群
產品說明
訓練及教學課程