我在SQL Server中有一个包含以下列的表:
Id Name ParentId LevelOrder
8 vehicle 0 0/8/
9 car 8 0/8/9/
10 bike 8 0/8/10/
11 House 0 0/11/
...
这会创建一个树。
假设我有LevelOrder 0/8/
,这应该只返回汽车和自行车行,但是如何在SQL Server中处理这个?
我试过了:
Select * FROM MyTable WHERE LevelOrder >= '0/8/'
但这不起作用。
答案 0 :(得分:3)
下划线字符将保证在'0/8 /'之后至少有一个字符,因此您不会在“车辆”行上获得匹配。
SELECT *
FROM MyTable
WHERE LevelOrder LIKE '0/8/_%'
答案 1 :(得分:0)
此代码允许您选择以0/8/
Select * FROM MyTable WHERE LevelOrder like '0/8/%'
答案 2 :(得分:0)
好的 -
虽然@ Joe的答案是最简单和最容易实现的(并且可能比我要建议的更好......),但更新异常存在一些问题。
具体来说:
parentId
列。您需要同步此levelOrder
列和风险不一致的数据。 (我相信这也违反了1NF,虽然我对确切定义的理解有点粗略......)levelOrder
包含整个层次结构。如果移动了任何一个父级,则必须修改所有子级行levelOrder
以反映此情况(可能非常混乱)。鉴于此,我推荐这里:
levelOrder
列,因为它的存在(通常)会导致问题。parentId
列动态构建层次结构。将列保留在原位,或将其移动到专用关系表。移动一个父节点只需要更新一个单元格,并且不会导致任何(数据,非语义)异常。 CTE应该与此表格类似(需要根据目的进行调整):WITH heir_parent (parentId, id) as (SELECT parentId, id
FROM table
WHERE id =
UNION ALL
SELECT b.parentId, b.id
FROM heir_parent as a
JOIN table as b
ON b.parentId = a.id)
目前,CTE返回给定id的所有子项的列表,其id和他们的直接父项。它可以调整为返回许多其他东西 - 虽然我建议CTE仅用于生成关系,并且外部连接以获取剩余数据。