【发布时间】:2021-08-07 16:36:46
【问题描述】:
我想使用 with 和删除 4 连接创建分层查询,有人可以帮助我是 SQL 视图的初学者。
CREATE VIEW CAR( ID, CARLEVEL) AS
select
t.C_ID,
coalesce(d.C_ID, coalesce(c.C_ID, coalesce(b.C_ID,
coalesce(a.C_ID, t.C_ID))))
from tablex t LEFT OUTER JOIN tablex a LEFT OUTER JOIN tablex b
LEFT OUTER JOIN tablex c
LEFT OUTER JOIN tablex d ON c.Title = d.C_ID ON b.Title = c.C_ID
ON a.Title = b.C_ID ON t.Title = a.C_ID
Tablex 的内容是:
C_ID Title
67 Null
68 Null
69 68
70 68
71 68
72 Null
81 Null
82 81
83 81
84 Null
86 Null
87 Null
104 81
105 81
106 81
107 Null
4707 81
我对 CTE 的期望是:
ID CAR LEVEL
69 68
70 68
71 68
68 68
82 81
83 81
104 81
105 81
106 81
4707 81
81 81
【问题讨论】:
-
没有分层引擎。递归查询的运行速度不会比 JOIN 快。如果您使用
hierarchyid而不是自引用 ID/Parent_ID,您将获得更好的性能。 那将消除所有连接并将子搜索转换为简单的范围搜索 -
hierarchyid值相当于节点 ID 的二进制路径,例如1/3/8/678。当您搜索1/3的子代时,服务器将一次性搜索所有以1/3开头的hierarchyid值。 -
我认为您正在寻找的是所谓的递归公用表表达式。一个很好的例子可以在这里找到:sqlservertutorial.net/sql-server-basics/…
-
为什么要嵌套
COALESCE函数?COALESCE,不像ISNULL允许 2+ 参数。 -
@satcha 为此,您需要递归 CTE。同样,您不会从中获得任何性能。充其量它会和 JOIN 一样快。仅当您想要处理超过 4 个级别时才需要递归 CTE。
COALESCE没那么贵。 This article shows how to use recursive CTEs 用于分层查询
标签: sql sql-server common-table-expression create-view hierarchical-query