如何在SQL中搜索levelOrder值?

时间:2011-08-09 18:44:05

标签: sql sql-server

我在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/' 

但这不起作用。

3 个答案:

答案 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的答案是最简单和最容易实现的(并且可能比我要建议的更好......),但更新异常存在一些问题。
具体来说:

  1. 您已有parentId列。您需要同步此levelOrder列和风险不一致的数据。 (我相信这也违反了1NF,虽然我对确切定义的理解有点粗略......)
  2. levelOrder包含整个层次结构。如果移动了任何一个父级,则必须修改所有子级行levelOrder以反映此情况(可能非常混乱)。
  3. 鉴于此,我推荐这里:

    1. 删除levelOrder列,因为它的存在(通常)会导致问题。
    2. 使用递归CTE和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)
    3. 目前,CTE返回给定id的所有子项的列表,其id和他们的直接父项。它可以调整为返回许多其他东西 - 虽然我建议CTE仅用于生成关系,并且外部连接以获取剩余数据。