如何用这个在SQLite中写sql?
How to write the sql in SQLite with this?
WITH cteCountDownlines AS
( --=== Count each occurrence of EmployeeID in the sort path
SELECT EmployeeID = CAST(SUBSTRING(h.SortPath,t.N,4) AS INT),
NodeCount = COUNT(*) --Includes current node
FROM dbo.Hierarchy h,
dbo.HTally t
WHERE t.N BETWEEN 1 AND DATALENGTH(SortPath)
GROUP BY SUBSTRING(h.SortPath,t.N,4)
) --=== Update the NodeCount and calculate the RightBower
UPDATE h
SET h.NodeCount = downline.NodeCount,
h.RightBower = (downline.NodeCount - 1) * 2 + LeftBower + 1
FROM dbo.Hierarchy h
JOIN cteCountDownlines downline
ON h.EmployeeID = downline.EmployeeID
;
即来自https://www.sqlservercentral.com/articles/hierarchies-on-steroids-1-convert-an-adjacency-list-to-nested-sets。
我尝试了很多方法但没有用。
分开的 cteCountDownlines 和 join 工作得很好,但不知道如何组合它们
如果您使用的是 SQLite 3.33.0+,您可以使用 UPDATE...FROM
语法:
WITH cteCountDownlines AS (
SELECT CAST(SUBSTR(h.SortPath,t.N,4) AS INT) EmployeeID,
COUNT(*) NodeCount
FROM Hierarchy h INNER JOIN HTally t
ON t.N BETWEEN 1 AND LENGTH(h.SortPath)
GROUP BY SUBSTR(h.SortPath,t.N,4)
)
UPDATE Hierarchy AS h
SET NodeCount = downline.NodeCount,
RightBower = (downline.NodeCount - 1) * 2 + h.LeftBower + 1
FROM cteCountDownlines downline
WHERE h.EmployeeID = downline.EmployeeID;
对于 SQLite 3.15.0+ 你可以使用这个语法:
WITH cteCountDownlines AS (
SELECT CAST(SUBSTR(h.SortPath,t.N,4) AS INT) EmployeeID,
COUNT(*) NodeCount
FROM Hierarchy h INNER JOIN HTally t
ON t.N BETWEEN 1 AND LENGTH(h.SortPath)
GROUP BY SUBSTR(h.SortPath,t.N,4)
)
UPDATE Hierarchy AS h
SET (NodeCount, RightBower) = (
SELECT downline.NodeCount,
(downline.NodeCount - 1) * 2 + h.LeftBower + 1
FROM cteCountDownlines downline
WHERE h.EmployeeID = downline.EmployeeID
);
请注意,没有等效于 SQL 服务器的 DATALENGTH()
功能。
函数 LENGTH()
我使用 returns 字符串中的字符数。
WITH cteCountDownlines AS
( --=== Count each occurrence of EmployeeID in the sort path
SELECT EmployeeID = CAST(SUBSTRING(h.SortPath,t.N,4) AS INT),
NodeCount = COUNT(*) --Includes current node
FROM dbo.Hierarchy h,
dbo.HTally t
WHERE t.N BETWEEN 1 AND DATALENGTH(SortPath)
GROUP BY SUBSTRING(h.SortPath,t.N,4)
) --=== Update the NodeCount and calculate the RightBower
UPDATE h
SET h.NodeCount = downline.NodeCount,
h.RightBower = (downline.NodeCount - 1) * 2 + LeftBower + 1
FROM dbo.Hierarchy h
JOIN cteCountDownlines downline
ON h.EmployeeID = downline.EmployeeID
;
即来自https://www.sqlservercentral.com/articles/hierarchies-on-steroids-1-convert-an-adjacency-list-to-nested-sets。 我尝试了很多方法但没有用。 分开的 cteCountDownlines 和 join 工作得很好,但不知道如何组合它们
如果您使用的是 SQLite 3.33.0+,您可以使用 UPDATE...FROM
语法:
WITH cteCountDownlines AS (
SELECT CAST(SUBSTR(h.SortPath,t.N,4) AS INT) EmployeeID,
COUNT(*) NodeCount
FROM Hierarchy h INNER JOIN HTally t
ON t.N BETWEEN 1 AND LENGTH(h.SortPath)
GROUP BY SUBSTR(h.SortPath,t.N,4)
)
UPDATE Hierarchy AS h
SET NodeCount = downline.NodeCount,
RightBower = (downline.NodeCount - 1) * 2 + h.LeftBower + 1
FROM cteCountDownlines downline
WHERE h.EmployeeID = downline.EmployeeID;
对于 SQLite 3.15.0+ 你可以使用这个语法:
WITH cteCountDownlines AS (
SELECT CAST(SUBSTR(h.SortPath,t.N,4) AS INT) EmployeeID,
COUNT(*) NodeCount
FROM Hierarchy h INNER JOIN HTally t
ON t.N BETWEEN 1 AND LENGTH(h.SortPath)
GROUP BY SUBSTR(h.SortPath,t.N,4)
)
UPDATE Hierarchy AS h
SET (NodeCount, RightBower) = (
SELECT downline.NodeCount,
(downline.NodeCount - 1) * 2 + h.LeftBower + 1
FROM cteCountDownlines downline
WHERE h.EmployeeID = downline.EmployeeID
);
请注意,没有等效于 SQL 服务器的 DATALENGTH()
功能。
函数 LENGTH()
我使用 returns 字符串中的字符数。